【发布时间】:2016-04-04 19:04:09
【问题描述】:
我正在使用 Haskell 表达学院学习 Haskell:通过多媒体学习函数式编程,我不确定如何解决这个练习。
使用由
给出的树的定义data Tree a = Node (Tree a) (Tree a) | Leaf a定义列表函数
zip和zipWith的树版本。那里 将是树叶或树木形状不同的地方 您必须在其中做出设计决策。尝试做出你的决定 尽可能优雅。
对于zip,我有这个,但我不确定它是否“优雅”
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
虽然我知道 zipWith 的优雅定义,但我不确定如何使其具有 zipWith 功能。
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys
zipWith _ _ _ = []
【问题讨论】:
-
请注意,您只需要定义
zipTreeWith :: (a -> b -> c) -> (Tree a) -> (Tree b) -> (Tree c),因为zipTree就是zipWith = zipTreeWith (,)的特例。
标签: haskell binary-tree