data Tree a = Leaf a
| Node (Tree a) (Tree a)
foldTree :: (b -> b -> b) -> (a -> b) -> Tree a -> b
foldTree op f (Leaf x) = f x
foldTree op f (Node l r) = foldTree op f l `op` foldTree op f r
现在必须使用foldtree实现maptree。
我是这样做的。
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree' f tree = foldTree Node (Leaf . f) tree
我最初想出来但还是没能开始工作的是:
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f tree = foldTree Node transFunc tree
where transFunc :: Tree a -> Tree b
transFunc (Leaf x) = Leaf (f x)
transFunc (Node l r) = Node (transFunc l) (transFunc r)
第二个函数是错误的,因为它的类型:
Tree a -> Tree b
虽然
foldTree
希望是
a -> b
在哪里?
a
是从
Tree a
是的。
b
是
mapTree
成为
Tree b
因此第三个论点
折叠树
应该是类型
a -> Tree b
是的。
所以最简单的固定版本
transFunc
是:
mapTree :: forall a b. (a -> b) -> Tree a -> Tree b
mapTree f tree = foldTree Node transFunc tree
where transFunc :: a -> Tree b
transFunc x = Leaf (f x)