Currying.

在 ML 中,每一个函数只有一个参数;多参数函数的形参本质上是一个包含多个变量的 tuple。

然而除此之外,有另一种方式可以实现所谓的多参数,那就是函数的 currying。即,通过匿名函数的嵌套实现类多参数函数结构,再通过语法糖进行等价转换。

注意第三条语句是第二条语句的 syntactic sugar,三个函数的作用完全相同。

1
2
3
fun p(x, y, z) = e
fun curry_p = fn x => fn y => fn z => e
fun curry_p2 x y z = e

通过 currying,我们还能实现函数的部分化应用 (partial application),从而消除 redundant arguments。

1
2
fun curry_p x y z = ... z
fun partial_curry_p x y = ...

基于 tuple 实现的多参数函数可以与 currying 多参数函数相互转换。

1
2
fun uncurry f x y = f(x, y)
fun curry f (x, y) = f x y