函數式編程-函數的合成與柯裏化
阿新 • • 發佈:2018-01-28
word pip 滿足 鏈接 img 註意 lang num 原因
函數式編程有兩個最基本的運算:合成和柯裏化。
2.1 函數的合成
如果一個值要經過多個函數,才能變成另外一個值,就可以把所有中間步驟合並成一個函數,這叫做"函數的合成"(compose)。
上圖中,X
和Y
之間的變形關系是函數f
,Y
和Z
之間的變形關系是函數g
,那麽X
和Z
之間的關系,就是g
和f
的合成函數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))
,有一個隱藏的前提,就是f
和g
都只能接受一個參數。如果可以接受多個參數,比如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
函數式編程-函數的合成與柯裏化