尝试根据 FoldTree 实现 MapTree
Trying to Implement MapTree in terms of FoldTree
尝试根据 foldTree 实现 mapTree。
data Tree a = Leaf | Node (Tree a) a (Tree a) deriving Show
foldTree 显示在这里
foldTree :: b -> (b -> a -> b -> b) -> Tree a -> b
foldTree l n Leaf = l
foldTree l n (Node lt x rt) = n (foldTree l n lt) x (foldTree l n rt)
到目前为止,这是我对 mapTree 的了解,但我对 haskell 比较陌生,我不确定从这里到哪里去
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f = foldTree Leaf (\x t1 t2 -> Node (f x) t1 t2)
我想这是一个练习/家庭作业,只是给你一个微调:
这个Node (Tree a) a (Tree a)
是:
- 一棵左树
a
类型的负载值。
- 一棵对的树
顺序。在这里 (\x t1 t2 -> Node (f x) t1 t2)
你从
构造了一个 -value-(编辑:节点!)
- 看起来/被命名为值的东西
f x
- 树1
- 树2
顺序.
解决 follow-up updated to mapTree f = foldTree Leaf (Node (f x) (\x t1 t2 -> t1 t2))
:上面的“和这里”故意含糊不清,让我们看一下
foldTree :: b -> (b -> a -> b -> b) -> Tree a -> b
-- 1 \_______2________/ 3 4
这需要:
- `Leafs` 的类型为 `b` 的值
- 一个组合函数,需要:
- 左折叠树`b`的结果
- 当前折叠节点`a`的值
- 折叠右树`b`的结果
- 并输出一个`b`
- 要折叠的树。
按照这个顺序。你的函数 `(\x t1 t2 -> Node (f x) t1 t2)` 代替 2
- 当前折叠节点`a`的值
- 左折叠树`b`的结果
- 折叠右树`b`的结果
- 并输出一个`b`
以该顺序。
所以你只需要把(\x t1 t2 -> Node (f x) t1 t2)
中->
两边的顺序改正即可。
尝试根据 foldTree 实现 mapTree。
data Tree a = Leaf | Node (Tree a) a (Tree a) deriving Show
foldTree 显示在这里
foldTree :: b -> (b -> a -> b -> b) -> Tree a -> b
foldTree l n Leaf = l
foldTree l n (Node lt x rt) = n (foldTree l n lt) x (foldTree l n rt)
到目前为止,这是我对 mapTree 的了解,但我对 haskell 比较陌生,我不确定从这里到哪里去
mapTree :: (a -> b) -> Tree a -> Tree b
mapTree f = foldTree Leaf (\x t1 t2 -> Node (f x) t1 t2)
我想这是一个练习/家庭作业,只是给你一个微调:
这个Node (Tree a) a (Tree a)
是:
- 一棵左树
a
类型的负载值。- 一棵对的树
顺序。在这里 (\x t1 t2 -> Node (f x) t1 t2)
你从
- 看起来/被命名为值的东西
f x
- 树1
- 树2
顺序.
解决 follow-up updated to mapTree f = foldTree Leaf (Node (f x) (\x t1 t2 -> t1 t2))
:上面的“和这里”故意含糊不清,让我们看一下
foldTree :: b -> (b -> a -> b -> b) -> Tree a -> b
-- 1 \_______2________/ 3 4
这需要:
- `Leafs` 的类型为 `b` 的值
- 一个组合函数,需要:
- 左折叠树`b`的结果
- 当前折叠节点`a`的值
- 折叠右树`b`的结果
- 并输出一个`b`
- 要折叠的树。
- 当前折叠节点`a`的值
- 左折叠树`b`的结果
- 折叠右树`b`的结果
- 并输出一个`b`
所以你只需要把(\x t1 t2 -> Node (f x) t1 t2)
中->
两边的顺序改正即可。