我有一个由数据结构表示的<?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
中的非详尽模式
但我使用括号。
我做错了什么?
答案 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
很容易看出,这里涵盖了所有情况,因为只有两个数据构造函数,并且我们没有对它们的参数设置模式约束。