【发布时间】:2015-10-01 23:03:52
【问题描述】:
我是 Haskell 的新手,为了练习,我一直在使用 foldr 和 foldl 实现一堆函数(map、length 等)。现在我想移动到树上!
我的树数据结构:
data Tree a = Node a [Tree a] deriving (Show)
我写了一个 Haskell 函数来折叠树:
treeFold :: (b->a->b) -> b -> Tree a -> b
treeFold f s (Node a []) = f s a
treeFold f s (Node a xs) = foldl f (f s a) (dFSList xs)
其中dFSList 是树中所有节点的列表。所以做类似的事情:
treeFold (+) 0 (Node 1 [Node 2 [], Node 3 []])
返回 6. 酷。
现在我想编写一个 Haskell 函数来映射树,但我想使用我的 treeFold 函数来完成它。这是我目前所拥有的:
treeMap f (Node a []) = (Node (f a) [])
treeMap f (Node a (x:xs)) = (Node (f a) (a list involving foldTree somehow??))
如何完成我的treeMap 函数?我希望能够做到
treeMap (+1) (Node 1 [Node 2 [], Node 3 []])
它应该返回
(Node 2 [Node 3 [], Node 4 []])
【问题讨论】:
-
您将树转换为平面列表的方式(可能具有任意顺序 w.r.t 树的形状)然后对其进行常规列表折叠意味着折叠不是特定于树的,即您的折叠功能不能考虑树的形状,只能以任意顺序查看内容。
标签: haskell dictionary tree fold