1. 程式人生 > >函數式編程-函數的合成與柯裏化

函數式編程-函數的合成與柯裏化

word pip 滿足 鏈接 img 註意 lang num 原因

函數式編程有兩個最基本的運算:合成和柯裏化。

2.1 函數的合成

如果一個值要經過多個函數,才能變成另外一個值,就可以把所有中間步驟合並成一個函數,這叫做"函數的合成"(compose)。

技術分享圖片

上圖中,XY之間的變形關系是函數fYZ之間的變形關系是函數g,那麽XZ之間的關系,就是gf的合成函數g·f

下面就是代碼實現了,我使用的是 JavaScript 語言。註意,本文所有示例代碼都是簡化過的,完整的 Demo 請看《參考鏈接》部分。

合成兩個函數的簡單代碼如下。


const compose = function (f, g) {
  return function (x) {
    return f(g(x));
  };
}

函數的合成還必須滿足結合律。

技術分享圖片


compose(f, compose(g, h))
// 等同於
compose(compose(f, g), h)
// 等同於
compose(f, g, h)

合成也是函數必須是純的一個原因。因為一個不純的函數,怎麽跟其他函數合成?怎麽保證各種合成以後,它會達到預期的行為?

前面說過,函數就像數據的管道(pipe)。那麽,函數合成就是將這些管道連了起來,讓數據一口氣從多個管道中穿過。

2.2 柯裏化

f(x)g(x)合成為f(g(x)),有一個隱藏的前提,就是fg都只能接受一個參數。如果可以接受多個參數,比如f(x, y)g(a, b, c),函數合成就非常麻煩。

這時就需要函數柯裏化了。所謂"柯裏化",就是把一個多參數的函數,轉化為單參數函數。


// 柯裏化之前
function add(x, y) {
  return x + y;
}

add(1, 2) // 3

// 柯裏化之後
function addX(y) {
  return function (x) {
    return x + y;
  };
}

addX(2)(1) // 3

有了柯裏化以後,我們就能做到,所有函數只接受一個參數。後文的內容除非另有說明,都默認函數只有一個參數,就是所要處理的那個值。

http://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html

函數式編程-函數的合成與柯裏化