我想以下列方式在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]}
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误.我究竟做错了什么 ?
两个问题:
let 是一种表达形式,在顶层,编译器期望一个声明表单.
你需要一个单一绑定的窝; 通过使用三个lets,您将定义拆分为三个单独的范围.
下面的代码编译,当我要求时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]}
Run Code Online (Sandbox Code Playgroud)