下面我给出了列表和树的数据构造函数。
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中使用该数据构造函数创建无限图?
答案 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。