跳轉到內容

程式語言簡介/偏應用

來自華夏公益教科書,開放的書籍,開放的世界

偏應用

[編輯 | 編輯原始碼]

在許多程式語言中,尤其是函數語言程式設計正規化中的成員,例如 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

閉包 · 顯著的高階函式

華夏公益教科書