我是Haskell的绝对新手。但我真的很喜欢它。我一直在阅读了解你一个Haskell 和真实世界Haskell 并一直在练习。我在了解你一个Haskell 一书的功能解决问题部分,我需要有人向我解释以下内容:
data Node = Node Road Road | EndNode Road
data Road = Road Int Node
问题:
答案 0 :(得分:2)
是的,这些是相互递归的数据类型。
要创建这些类型的值,您可能也会使用递归。例如,这是一个最小的道路系统 - 两个节点,每个节点允许您开车到另一个:
nodeA, nodeB :: Node
nodeA = EndNode (Road 99 nodeB)
nodeB = EndNode (Road 99 nodeA)
注意nodeA的定义如何引用nodeB,反之亦然。
如果我正确阅读了本书中的例子,可以这样写:
aRoad, bRoad :: Road
aRoad = Road 50 a1
bRoad = Road 10 b1
a1, a2, a3, a4 :: Node
a1 = Node (Road 5 a2) (Road 30 b1)
a2 = Node (Road 40 a3) (Road 20 b2)
a3 = Node (Road 10 a4) (Road 25 b3)
a4 = EndNode (Road 0 b4)
b1, b2, b3, b4 :: Node
b1 = Node (Road 90 b2) (Road 30 a1)
b2 = Node (Road 2 b3) (Road 20 a2)
b3 = Node (Road 8 b4) (Road 25 a3)
b4 = EndNode (Road 0 a4)
再次注意交叉道路的a1和b1,a2和b2等的相互递归。
我已经将这些道路写成了内联,但当然如果您愿意,可以将它们全部命名为:
roadA1ToB1 :: Road
roadA1ToB1 = Road 30 b1
如果你这样做,定义的循环将涉及其中的四个 - (节点)a1
的定义将使用roadA1ToB1
,这将使用b1
,这将使用roadB1ToA1
,这将使用a1
。