Haskell图数据类型表示

Joh*_*ack 5 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]}
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误.我究竟做错了什么 ?

Nor*_*sey 7

两个问题:

  1. let 是一种表达形式,在顶层,编译器期望一个声明表单.

  2. 你需要一个单一绑定的窝; 通过使用三个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)

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