编程语言简介/偏应用
外观
< 编程语言简介
在许多编程语言中,尤其是函数式编程范式中的成员,例如 ML 和 Haskell,每个函数只接受一个参数作为输入参数。例如,一个 ML 函数,比如 add(x, y)
,不接受两个参数,x 和 y,正如我们最初所想的那样。它接受一个参数:元组 (x, y)
- fun add(x, y) = x + y;
val add = fn : int * int -> int
- val t = (2, 3);
val t = (2,3) : int * int
- add t;
val it = 5 : int
为了让开发者有一种函数接受多个参数的错觉,这些语言采用了名为 柯里化 的技术。一个柯里化的函数,比如 f(x)(y),接受一个参数 x,并返回一个新的函数,它接受另一个参数 y,并且可以在其主体内部使用 x 的值。例如,下面的函数是前面 add
实现的柯里化版本
- fun add_curry x y = x + y;
val add_curry = fn : int -> int -> int
- add_curry 2 3;
val it = 5 : int
通常我们不需要传递柯里化函数期望的所有参数序列。如果我们只传递这个参数序列的前缀,那么我们就得到了一个 偏应用。偏应用的结果通常实现为闭包。例如,下面我们使用 add_curry
函数作为函数工厂
- fun add_curry a b = a + b;
val add_curry = fn : int -> int -> int
- val inc = add_curry 1;
val inc = fn : int -> int
- inc 2;
val it = 3 : int
- val sum2 = add_curry 2;
val sum2 = fn : int -> int
- sum2 2;
val it = 4 : int