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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 19:15:00