如何在haskell中定义树上的zip函数

时间:2013-03-24 06:08:40

标签: haskell tree

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

我无法弄清楚如何在Haskell中编写zipzipWith函数的树版本。

1 个答案:

答案 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。