Haskell图数据类型表示

时间:2010-05-06 23:43:20

标签: haskell

我想以下列方式在Haskell中表示图形:

对于每个节点,我想存储它的值和相邻节点的列表。我遇到的问题是我希望将相邻节点存储为对其他节点的引用。

例如,我希望节点ny存储为(“NY”(lp)),其中l和p是相邻节点,而不是(“NY”(“伦敦”“巴黎”))。
我试过这样的事情:

data Node a = Node { value :: a
                   , neighbors :: [Node a]
                   }deriving (Show)

let n1 = Node {value=1, neighbors=[n2]}
let n2 = Node {value=1, neighbors=[n1 n3]}
let n3 = Node {value=1, neighbors=[n2]}

但是我在let中遇到了错误。我做错了什么?

2 个答案:

答案 0 :(得分:7)

两个问题:

  1. let是一种表达形式,在顶层,编译器需要一个声明表格。

  2. 您需要单个绑定嵌套;通过使用三个let,您可以将定义拆分为三个不同的范围。

  3. 以下代码编译,当我要求n1时,我会按预期获得无限字符串打印输出:

    module Letnest 
    where
    data Node a = Node { value :: a
                       , neighbors :: [Node a]
                       } deriving (Show)
    
    n1 = Node {value=1, neighbors=[n2]}
    n2 = Node {value=1, neighbors=[n1, n3]}
    n3 = Node {value=1, neighbors=[n2]}
    

答案 1 :(得分:4)

我不会以这种方式代表图表。将节点存储在Map或Array中,并通过其键引用它们,而不是直接指向它们。这将更容易保存,加载,维护和使用。

对于您当前代表的一些问题:

Reid Barton评论道:

  

请注意,n1和n3完全无法区分(因为它们具有相同的定义),根据您的应用,这可能是此表示的问题。

(Haskell中的Python没有is比较)

诺曼拉姆齐注意到:

  

我得到一个无限的字符串打印输出