Haskell中Rose树的fold函数实现求助
实现Rose树的foldRose函数
首先明确Rose树的常规定义(你的代码中应该已定义类似结构):
data Rose a = Node a [Rose a]
对比二叉树的foldTree,你已经找对了foldRose的类型签名——Rose树每个节点携带一个子树列表,所以合并函数的第二个参数是[b],而非二叉树的两个单独b。
你当前代码的问题在于:xs是[Rose a]类型的子树列表,但foldRose c只能接收单个Rose a节点。解决方法是用map遍历这个列表,对每个子树递归调用foldRose c,把所有子树的折叠结果收集成[b],再传给合并函数c。
修复后的完整实现:
foldRose :: (a -> [b] -> b) -- 合并函数:节点值 + 所有子树的折叠结果 -> 当前节点的折叠结果 -> Rose a -- 输入的Rose树 -> b -- 最终折叠结果 foldRose c (Node x xs) = c x (map (foldRose c) xs)
逻辑解释
- 对于
Node x xs,先递归折叠每个子树:map (foldRose c) xs会把每个Rose a转换成b,得到[b]类型的子树折叠结果列表 - 再把当前节点的值
x和子树折叠结果列表传给合并函数c,得到当前节点的折叠结果
如果你的Rose树定义包含空节点(类似二叉树的Tip),则需要补充base case参数和模式匹配:
data Rose a = Node a [Rose a] | Empty foldRose :: (a -> [b] -> b) -> b -- 空节点的base case -> Rose a -> b foldRose c b (Node x xs) = c x (map (foldRose c b) xs) foldRose c b Empty = b
内容的提问来源于stack exchange,提问作者MagicMCE
相关产品推荐
相关产品推荐

