如何声明图形的数据构造函数

时间:2013-11-04 15:57:49

标签: haskell graph constructor

下面我给出了列表和树的数据构造函数。

data List a = NilL | Cons a (List a) deriving Show
data Tree a = NilT | Branch a [Tree a] deriving Show

通过这些定义,我可以轻松创建无限结构,如下所示:

list = Cons 1 list
tree = Branch 1 lt
 where
  lt = tree : lt

我想以这种方式创建无限图(有向和无向)。如何为它声明数据构造函数以及如何在Haskell中使用该数据构造函数创建无限图?

1 个答案:

答案 0 :(得分:1)

一个简单的解决方案是使用某种形式的间接,比如索引

type Vertex = Integer
data Graph = Graph [Vertex] [(Vertex, Vertex)]

infGraph = Graph [1..] [(a, b) | a <- [1..], b <- [1..]]

然而,这并不像打结

那么令人满意
data Vertex = Vertex { tag   :: Integer
                     , edges :: [Vertex] }

type Graph = [Vertex] -- A graph is determined by the set of vertices

-- Construct a graph of infinitely many vertices in which
-- each vertex is connected.
infGraph = map (flip Vertex infGraph) [1..]
infGraph' = map (\v' -> v' infGraph') . map Vertex $ [1..]

我们map Vertex超过[1..],它为我们提供了一个函数列表[Vertex] -> Vertex,它们需要一个边连接列表来连接每个顶点。由于infGraph是所有顶点的列表,因此我们将其传递给每个Vertex并打结。

当然,对于认真的工作,请使用package