如何在Haskell中用foldl/foldr/递归对嵌套列表执行Job中未知函数
代码问题分析
你的代码存在3个核心问题:
- foldl的入参格式错误:foldl要求接收的折叠函数是两个参数(累积状态、当前遍历元素),你写的
\x -> f s是单参数函数,类型不匹配会直接触发编译报错。 - 状态更新逻辑错误:折叠函数里始终使用初始传入的
s调用f,完全没有使用上一步计算得到的累积状态x,就算类型修好了,执行完所有任务最终只会返回第一个任务的执行结果,不会按顺序串联所有任务函数。 - 逻辑冗余:你已经手动对列表做了首元素模式匹配,又调用foldl遍历剩余列表,属于两种实现思路混用,逻辑混乱。
修复方案
你要的功能本质就是遍历任务列表,逐个把任务函数应用到上一步的状态上,foldl本身就是为这种状态累积场景设计的,完全不需要手动做列表模式匹配,最简实现如下:
data Time = Time Int Int data Job a = Job Time (a -> a) -- foldl实现版本 perform :: a -> [Job a] -> a perform = foldl (\acc (Job _ f) -> f acc)
如果要写纯递归版本不需要fold,代码如下:
perform :: a -> [Job a] -> a perform s [] = s perform s ((Job _ f):rest) = perform (f s) rest
两种实现都满足适配任意类型状态、任意符合a->a签名的任务函数的要求,会按列表顺序逐个应用任务函数更新状态。
内容的提问来源于stack exchange,提问作者donaldtheduckkk00
相关产品推荐
相关产品推荐

