在Haskell中保存图形

时间:2008-12-28 00:26:09

标签: haskell serialization graph-theory directed-graph

我可以轻松地为有向图的节点定义数据类型。

data Node = Node String [Node] derving (Show, Read)

我可以使用show function将图表保存到文件中,然后使用read恢复它。但是,节目不会应付一个周期。是否有一种保存和恢复图形的简单方法?

2 个答案:

答案 0 :(得分:8)

据我所知。你必须编写一个图遍历函数。

首先,决定在哪里打破循环。在这种情况下,它是微不足道的:使用节点名称(假设它们在图形中是唯一的)。对于更复杂的结构,例如将节点和边作为单独类型的图,您必须决定是否存储带有节点的边,带边的节点,还是保持节点和边完全分开。

然后枚举图中的所有节点。在这种情况下,显而易见的方法是在有限映射中遍历图表收集节点(参见Data.Map)。然后将每个节点存储为名称,后跟其他节点名称列表。

恢复图表意味着使用“打结”模式。将存储的图形读入[[String,[String])]的结构中。然后可以使用以下代码重建原始图形:

import qualified Data.Map as M

data Node = Node String [Node]

instance Show Node where
   show (Node name others) = "Node " ++ show name ++ 
         " " ++ show (map nodeName others)
      where nodeName (Node n _) = n

restoreGraph :: [(String, [String])] -> M.Map String Node
restoreGraph pairs = table
   where
      table = M.fromList $ map makeNode pairs
      makeNode (name, others) = (name, Node name $ map findNode others)
      findNode str = fromJust $ M.lookup str table

注意相互递归:table调用makeNode,调用findNode,调用table。 Thanks to lazy evaluation this does the Right Thing

编辑代码现已经过测试并略有扩展。

答案 1 :(得分:2)

是和否。它可以通过您对Node类型结构的领域知识来完成,并定义一些您可以测试的相等概念,并结合目前为止看到的节点列表或映射来恢复共享。在病理学案例中,GHC中有一个StableName概念来构建这样一个概念。

另一方面,Matt Morrow已经做了一些工作,以汇编语言.S文件的形式提取,使用他方便的真空库的任意循环数据。因此,无论是真空还是真空都可能满足您的需求。

一般来说,避免伏都教和跟踪到目前为止在地图中看到的节点可能是最合理和可维护的解决方案。