尝试根据 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)是:

  1. 一棵左树
  2. a 类型的负载值。
  3. 一棵对的树

顺序。在这里 (\x t1 t2 -> Node (f x) t1 t2) 你从

构造了一个 -value-(编辑:节点!)
  1. 看起来/被命名为值的东西f x
  2. 树1
  3. 树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

这需要:

  1. `Leafs` 的类型为 `b` 的值
  2. 一个组合函数,需要:
    1. 左折叠树`b`的结果
    2. 当前折叠节点`a`的值
    3. 折叠右树`b`的结果
    4. 并输出一个`b`
  3. 要折叠的树。
按照这个顺序。你的函数 `(\x t1 t2 -> Node (f x) t1 t2)` 代替 2
  1. 当前折叠节点`a`的值
  2. 左折叠树`b`的结果
  3. 折叠右树`b`的结果
  4. 并输出一个`b`
以该顺序。

所以你只需要把(\x t1 t2 -> Node (f x) t1 t2)->两边的顺序改正即可。