【发布时间】:2015-05-20 17:49:21
【问题描述】:
我正在尝试创建自定义数据类型树。定义如下:
一棵树可以定义为一个叶子(由关键字“Leaf”标识)包含一条信息(即它是一个没有子节点),或一个节点(由关键字“Node”标识)使用一条信息,加上一个树列表——列表中的每个元素代表一个以相应子节点为根的子树。请注意,在此定义下,树永远不能为空。 这意味着一棵树可以是:
- 叶数据;或
- 节点数据 [data, data, ...] -- 列表中可以有零个或多个树
这是我的代码:
data Tree a = Leaf a | Node a [ Tree a ] deriving (Show)
foldt :: (a -> a -> a) -> Tree a -> a
foldt f (Leaf a) = a
foldt f (Node a []) = a
foldt f (Node a [b]) = f a (foldt f b)
它可以编译,但是当我尝试运行时:
let myTree = Node 'A' [Node 'B' [Leaf 'E', Node 'F' [Leaf 'I', Leaf 'J', Leaf 'K']], Node 'C' [Leaf 'G', Leaf 'H'], Leaf 'D']
foldt min myTree
我收到以下错误,而不是预期的输出 'A':
CSC207a4.hs:(6,1)-(8,38): Non-exhaustive patterns in function foldt
我的函数的哪一部分不是详尽的,或者我是否错误地定义了数据类型?
更新:
我可能已经解决了非穷举模式,我现在有了这个,但它声称树没有定义:
数据树 a = 叶 a |节点a[树a]推导(显示)
foldt :: (a -> a -> a) -> Tree a -> a
foldt f (Leaf a) = a
foldt f (Node a []) = a
foldt f (Node a [(Tree x)]) = f a (foldt f x)
foldt f (Node a [(Tree x):xs]) = f a (foldt f (f x (foldt f xs)))
【问题讨论】:
-
您只考虑了
[Tree a]是 0 个元素或 1 个元素的情况。如果我有Node 1 [Leaf 2, Leaf 3]怎么办? -
我想我找到了解决办法,但现在它声称当我尝试使用 Tree 时它不存在。
-
Leaf和Node实际上不是关键字——它们是数据构造函数。 -
那是什么意思?
-
关键字类似于
let、if、then等,内置于语言语法中。数据构造器是您在 Haskell 中从较小的部分构建值的方式。然后,数据构造函数上的模式匹配是您从值中取出较小部分的方法。