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