data Tree a = Leaf a | Node (Tree a ) (Tree a)
我无法弄清楚如何在Haskell中编写zip
和zipWith
函数的树版本。
答案 0 :(得分:6)
你的树不允许形成良好的空树 - 你可以做一个狡猾的Node undefined undefined
,但这不是很好。正如其他人所评论的那样,一个简单的treeZip将需要两棵树具有相同的形状以获得“好”的结果。
zipTree :: Tree a -> Tree b -> Tree (a,b)
zipTree (Leaf a) (Leaf b) = Leaf (a,b)
ZipTree (Node l1 r1) (Node l2 r2) =
let l = zipTree l1 l2
r = zipTree r1 r2
in Node l r
-- Problems...
zipTree (Node _ _) (Leaf _) = Node undefined undefined
ZipTree (Leaf _) (Node _ _) = Node undefined undefined
请注意,simpleminded tree zipping截断形状而不仅仅是“length”(如果形状不匹配将截断) - 这比截断“on length”的列表更严重(严格来说列表会截断“shape”)但“形状”必须始终相同。)
因此,如果我正在编写一个Tree库,我就不会定义zipTree。