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

SML中如何使用foldr实现列表内函数的链式复合调用

实现方案

完全可以实现,利用foldr从右往左遍历列表的特性刚好匹配你需要的函数执行顺序(先执行列表最后一个函数c,再执行b,最后执行a),具体实现如下:

核心代码

你给出的基础定义:

val a = fn x => x + 10
val b = fn x => x * x
val c = fn x => (x - 2) * 3
val fs = [a, b, c]

基于foldr的通用多函数复合实现:

(* 接收函数列表,返回复合后的总函数,支持后续任意参数调用 *)
val composeAll = foldr (fn (currentFunc, composedFunc) => fn x => currentFunc (composedFunc x)) (fn x => x)

(* 调用方式,等价于 a(b(c(5))) *)
val result = composeAll fs 5

执行逻辑说明

  • foldr的第二个参数是恒等函数fn x => x,作为函数复合的单位元,空列表调用时会直接返回输入值
  • 遍历[a,b,c]的过程:
    • 先处理最右侧的c,和初始恒等函数复合得到函数fn x => c(x)
    • 再处理b,和上一步结果复合得到函数fn x => b(c(x))
    • 最后处理a,和上一步结果复合得到最终的fn x => a(b(c(x)))
  • 给最终复合函数传入参数5,得到的计算结果为91,和直接写a(b(c(5)))的结果完全一致

简化写法(仅单次求值用)

如果你不需要复用复合函数,只需要单次计算结果,可以直接写为一行:

val result = foldr (fn (f, acc) => f acc) 5 fs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 05:54:02