我正在使用图形,并创建了称为顶点的自定义类型。
type Vertex = (Int, [Vertex])
该类型是一对,Int
其对是特定顶点的索引号,并且[Vertex]
是与该顶点相邻的顶点的列表。
然后,我创建了图的邻接表。我碰到了这个问题。如何为该给定顶点类型定义相邻顶点的列表?
我们有一个带有两个顶点的图。我们称它们为1和2。他们之间有优势。因此,顶点1与顶点2相邻,反之亦然。现在,我的邻接列表如下所示:
adjacencyList :: [Vertex]
adjacencyList = [ (1, [ (2, [ (1, [ (2, [ (1, …) ]) ]) ]) ])
, here would go the vertex 2 ]
因此,您可以看到问题是我的顶点类型的递归定义-顶点1具有相邻的顶点2,该顶点具有相邻的顶点1,其相邻的顶点2具有相邻的顶点1,等等。在我看来,这个定义是无限的。
在像C ++这样的命令式语言中,我会使用指针来解决这个问题。但是如何在Haskell中克服这个问题呢?
这就是为什么懒惰很方便的原因。你可以做
adjacencyList :: [Vertex]
adjacencyList = [a, b]
where a = (1, [b])
b = (2, [a])
如果您来自c ++世界,那么这段代码可能看起来很神秘。但是,与c ++中的相互递归函数相比,这确实没有什么奇怪的。(实际上,想法几乎是相同的。)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句