我正在尝试创建自定义数据类型树。定义如下:
树可以定义为包含单条信息的叶子(由关键字“Leaf”标识)(即,它是没有子节点的节点),或者节点(由关键字“Node”标识)使用单个信息,加上树列表 - 列表中的每个元素表示以相应子项为根的子树。请注意,在此定义下,树永远不能为空。 这意味着树可以是:
- 叶子数据;或
- 节点数据[数据,数据......] - 列表中可以有零个或多个树
这是我的代码:
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)))
答案 0 :(得分:2)
你可以通过打开警告来获得GHC的帮助。 “大锤子”是-Wall
:
-- At the very top of the file
{-# OPTIONS_GHC -Wall #-}
噪音较小的方法也会起作用:
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
其中任何一个都会在编译时为您提供未能匹配的模式的明确列表。
将Tree
置于您的模式中的原因是Tree
是类型构造函数(通过将它们放在左侧而进行的排序) {/ 1}}或data
声明的双手侧面。只有数据构造函数(通过将它们放在newtype
或data
声明的右侧侧面上进行排序)可以在模式中匹配。
答案 1 :(得分:1)
我找到了答案。在我熬夜之后,我有一丝灵感。这是:
module CSC207a4 where
data Tree a = Leaf a | Node a [ Tree a ] deriving (Show)
foldt :: (a -> a -> a) -> Tree a -> a
foldt _ (Leaf a) = a
foldt _ (Node a []) = a
foldt f (Node a b) = f (foldt f x) (foldt f (Node a xs))
where
x:xs = b
这会传递所有测试用例,并回答我的问题。