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

Haskell multiCompose多函数列表组合实现及错误代码排查

Haskell multiCompose 练习题解答

1. 正确实现代码

递归写法

multiCompose :: [a -> a] -> a -> a
multiCompose [] = id  -- 空组合返回恒等函数,输入什么返回什么
multiCompose (f:fs) = f . multiCompose fs

高阶函数简写(一行实现)

利用foldr从右到左遍历列表,用(.)做组合,初始值为恒等函数id:

multiCompose :: [a -> a] -> a -> a
multiCompose = foldr (.) id

可以用题目给出的示例验证正确性:

  • multiCompose [(3*), (2^), (+1)] 0 计算过程:3 * (2 ^ (0 + 1)) = 6,符合要求
  • multiCompose [reverse, tail, (++"bar")] "foo" 计算过程:reverse (tail ("foo" ++ "bar")) = reverse "oobar" = "raboo",符合要求

2. 你的代码无法运行的原因

你的写法存在三个核心问题:

  • 基础 case 逻辑错误:你空列表分支写了(1*) $,首先(1*)是仅支持数值类型的函数,无法适配字符串等其他类型的输入,不符合示例中multiCompose [] "foo" == "foo"的要求;正确的空组合应该返回通用的恒等函数id。其次末尾多余的$会导致语法错误,$是低优先级函数应用运算符,此处没有后续参数不需要使用。
  • 递归步骤混淆了函数组合和函数应用:你递归分支写的(multiCompose (init fs)) (last fs) $是把前n-1个函数的组合结果作为函数,直接应用到last fs上,这是函数调用逻辑,不是函数组合逻辑。正确的写法应该用组合运算符.连接两个部分:multiCompose (init fs) . last fs。
  • 推导逻辑的本质错误:你推导过程中全程用$做函数应用,得到的执行顺序和题目要求完全相反。题目要求的是列表的函数从右到左依次应用到输入上,本质是函数组合链,而不是把前一个组合结果应用到后一个函数上。

内容的提问来源于stack exchange,提问作者lt512

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:54:01