Haskell图数据类型表示法

Haskell图数据类型表示法,haskell,Haskell,我想用Haskell以以下方式表示一个图: 对于每个节点,我要存储它的值和相邻节点的列表。我遇到的问题是,我希望将相邻节点存储为对其他节点的引用 例如,我希望节点ny存储为(“ny”(LP)),其中l和p是相邻节点,而不是(“ny”(“伦敦”(“巴黎”))。 我试过这样的方法: data Node a = Node { value :: a , neighbors :: [Node a] }deriving (Show)

我想用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中出错了。我做错了什么?

两个问题:

  • let
    是一种表达式形式,在顶层,编译器需要一种声明形式

  • 您需要一个绑定嵌套;通过使用三个
    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]}
    

    我不会用这种方式表示图形。将节点存储在地图或数组中,并通过它们的键引用它们,而不是直接指向它们。这将更易于保存、加载、维护和使用

    有关当前表示的某些问题,请执行以下操作:

    里德·巴顿评论道:

    请注意,n1和n3完全不可区分(因为它们具有相同的定义),这可能是此表示法的一个问题,具体取决于您的应用程序

    (在Haskell中,没有比较a Python的

    诺曼·拉姆齐注意到:

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


    请注意,
    n1
    n3
    完全无法区分(因为它们具有相同的定义)根据您的应用程序,这种表示可能有问题。您可能已经习惯于在ghci提示符下使用
    let
    ,但在实际haskell程序的顶层并不需要它。我也不会像这样表示图形,但我的作业是这么说的:)@John Retallack:哦,我希望下一个作业这是关于如何表示图形的问题。