You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:20:37