Haskell - 打印树数据:函数toList中的非穷举模式

时间:2017-02-28 13:40:46

标签: haskell tree functional-programming

我有一个由数据结构表示的<?xml version="1.0" encoding="UTF-8"?> <ns2:orderShipment> <ns2:orderData> <ns2:productId>1</ns2:productId> <ns2:orderStatus> <ns2:status>Shipped</ns2:status> <ns2:statusQuantity> <ns2:amount>1</ns2:amount> </ns2:statusQuantity> <ns2:trackingInfo> <ns2:shipDateTime>Fri, 24 Feb 2017</ns2:shipDateTime> <ns2:carrierName>UPS</ns2:carrierName> <ns2:methodCode>Standard</ns2:methodCode> <ns2:trackingNumber>123123123</ns2:trackingNumber> <ns2:trackingURL>http://ups.com</ns2:trackingURL> </ns2:trackingInfo> </ns2:orderStatus> </ns2:orderData> </ns2:orderShipment>

tree

现在我需要打印树叶的数据:

data Tree a = Node (Tree a) (Tree a)| Leaf a

t1 :: Tree Int
t1 = (Node (Node (Leaf 23) (Leaf 42)) (Node (Leaf 19) (Leaf 65)))

不幸的是我一直收到错误:

  

功能toList

中的非详尽模式

但我使用括号。

我做错了什么?

1 个答案:

答案 0 :(得分:5)

这意味着您可以使用值调用toList,并且所有行都将无法触发

当我使用两个Node s toList (Node (Node x y) (Node z t))调用您的脚本时就是这种情况。在这种情况下,所有行都将失败。您可能想要添加以下行:

toList (Node (Node x y) (Node z t)) = (toList (Node x y))++(toList (Node x y))

或者更短一些:

toList (Node a@(Node _ _) b@(Node _ _)) = (toList a)++(toList b)

另一个是Leaf toList (Leaf x)

toList (Leaf x) = [x]

据说你让事情过于复杂。您可以简单地使用两行:

toList :: Tree a -> [a]
toList (Leaf x) = [x]
toList (Node x y) = toList x ++ toList y

很容易看出,这里涵盖了所有情况,因为只有两个数据构造函数,并且我们没有对它们的参数设置模式约束。