使用折叠SML的合成

  • 本文关键字:SML 折叠 sml fold
  • 更新时间 :
  • 英文 :


有什么方法可以从包含函数的变量中执行类似a(b(c(5((的操作吗?

代码应该是这样的:

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

您可以将op应用于组合运算符o,使其可以用作函数,然后将该函数与foldr一起使用,将函数列表向下折叠为单个函数。使用身份函数作为初始值。

因此,foldr (op o) identity [a, b, c]等价于a o (b o (c o identity)),其中identity是身份函数:

fun identity x = x;

使用已发布的abcfs的定义,将OP示例写成一行代码也不错:

- (foldr (op o) (fn x => x) fs) 5;
val it = 91 : int
- a(b(c 5));
val it = 91 : int

如果已经定义了identity,这会更容易一些,但定义一个更高阶的函数来抽象它会更好:

fun composeList fs = foldr (op o) (fn x => x) fs;
- composeList fs 5;
val it = 91 : int

最新更新