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
相关产品推荐
相关产品推荐

