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)))
- 先处理最右侧的c,和初始恒等函数复合得到函数
- 给最终复合函数传入参数5,得到的计算结果为91,和直接写
a(b(c(5)))的结果完全一致
简化写法(仅单次求值用)
如果你不需要复用复合函数,只需要单次计算结果,可以直接写为一行:
val result = foldr (fn (f, acc) => f acc) 5 fs
内容的提问来源于stack exchange,提问作者Teachh
相关产品推荐
相关产品推荐

