使用 foldr SML 组合
Composition using foldr SML
有什么方法可以从包含函数的变量中执行类似 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;
使用已发布的 a
、b
、c
和 fs
的定义,将 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
有什么方法可以从包含函数的变量中执行类似 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;
使用已发布的 a
、b
、c
和 fs
的定义,将 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