2010-05-06 89 views
5

我要代表在Haskell以下面的方式的曲线图:Haskell的图形数据类型表示

对于我要存储它的值和相邻节点的列表中的每个节点。我遇到困难的问题是我希望将相邻节点存储为其他节点的引用。例如,我希望节点ny被存储为(“NY”(l p)),其中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]} 

但我得到的连接错误,出租。我究竟做错了什么 ?

+1

你可能习惯使用' let'在ghci提示符下,但在实际的haskell程序中不需要顶层。 – 2010-05-07 07:10:42

回答

7

两个问题:

  1. let是表达形式,并在顶层编译器期待一个申报表。

  2. 您需要一个单个嵌套的绑定;通过使用三个let s,您将定义分为三个单独的范围。

下面的代码编译,当我问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]} 
+3

请注意,'n1'和'n3'是完全不可区分的(因为它们具有相同的定义),这取决于您的应用,可能是这种表示的问题。 – 2010-05-07 06:02:47

4

我不会代表图这个样子。将节点存储在一个Map或一个数组中,并通过它们的键引用它们而不是直接指向它们。这将更容易保存,加载,维护和使用。

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

雷德巴顿说:

注意,N1和N3是完全没有区别(因为它们具有相同的定义),这取决于你的应用程序,可成为这种表示的问题。

(没有is比较LA的Python在Haskell)

诺曼·拉姆齐注意到:

我得到一个无限串打印

+1

我并不代表这样的图表,但这就是我的作业所说:) – 2010-05-08 16:11:35

+0

@John Retallack:哦。我希望下一个家庭作业问题是关于你如何代表图表。 – yairchu 2010-05-08 16:41:05