跳转到内容

编程语言简介/偏应用

来自维基教科书,开放的书籍,开放的世界

偏应用

[编辑 | 编辑源代码]

在许多编程语言中,尤其是函数式编程范式中的成员,例如 ML 和 Haskell,每个函数只接受一个参数作为输入参数。例如,一个 ML 函数,比如 add(x, y),不接受两个参数,xy,正如我们最初所想的那样。它接受一个参数:元组 (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

闭包 · 显著的高阶函数

华夏公益教科书