Haskell高阶函数lreduce实现思路及方法求教
实现思路与原理解答
你需要实现的lreduce本质是非空列表的左折叠,效果和标准库的foldl1完全一致,以下是用foldr实现的方案和原理说明:
完整实现代码
lreduce :: (a -> a -> a) -> [a] -> a lreduce f (x:xs) = foldr (\b g acc -> g (f acc b)) id xs x
原理拆解
核心思路是利用
foldr构造嵌套的函数链,反向实现左到右的计算逻辑:- 我们让
foldr的返回值不是最终计算结果,而是一个单参数函数,用来接收左侧传递过来的累计值,再和当前元素做运算 foldr的初始值设为id(恒等函数),对应列表最右端的逻辑:接收左侧累计值后直接返回,没有后续元素需要计算- 每遍历到一个列表元素
b,就生成一个新的函数:接收左侧累计值acc,先调用f acc b得到新的累计值,再传给上一层(更靠近列表左侧)的函数继续处理 - 最后把列表的第一个元素
x作为初始累计值,传入foldr构造好的函数链,就能得到左折叠的计算结果
- 我们让
边界说明:你给出的函数签名没有处理空列表入参,和题目要求的入参是至少包含1个元素的
[a1,a2,...,an]匹配,传入空列表会触发模式匹配错误,符合题目预期。
效果验证示例
你可以用以下测试用例确认实现正确性:
-- 加法测试:预期结果((1+2)+3)+4=10 testAdd = lreduce (+) [1,2,3,4] -- 减法测试:预期结果((10-3)-2)-1=4 testSub = lreduce (-) [10,3,2,1]
内容的提问来源于stack exchange,提问作者TrynaLearnCode
相关产品推荐
相关产品推荐

