函數(shù)式編程基本概念理解二:Compose

composition(組合) 是函數(shù)式編程的基石。但是實現(xiàn)組合并不是一件簡單直接的事情。除了前一節(jié)我們介紹的概念,還需要基礎(chǔ)的數(shù)學(xué)知識。


從數(shù)學(xué)說起


先看個公式:

若  y = f(x),z=g(y) , 則 z= g(f(x))

這個我們都是認(rèn)可的,因為兩個 y是指同一個值。那我們變一下:

 若 y' = f(x) , z=g(y'') , 則 z  ?? 

這里 z應(yīng)該怎么寫? 我們犯難了,因為 y'y'' 不一定是同一個值,如果再有一個函數(shù)m, 使得y'' = m(y')z = g(f(m(y')))。這個函數(shù) m即是 y'y''的映射, 寫出來就是 y => m(y)。 這樣的函數(shù)在編程語言中是很常見的,比如 Array.map, Int.toString 等都是這樣的函數(shù)。


Compose (組合)


看了上面的問題,我們這里討論下組合即滿足集合的條件。組合其實就是拼接。


image.png

一般來說,要拼接,要滿足以下規(guī)則:

  1. 順序性,鏈接的各個部件之間要有順序。
  2. 可拼接性,前一個尾部連接點和后面的鏈接點個數(shù)量,類型要匹配。

回到我們的編程世間里,上面說的要鏈接的部件其實就是變量和函數(shù)。(也就解釋了在函數(shù)式編程中函數(shù)為什么是一等公民,因為他要跟變量一樣可以被賦值和傳遞。)所以順序性就是函數(shù)和變量的順序。這個可以有業(yè)務(wù)和邏輯可以來保證。那可拼接性就是前一個變量 / 函數(shù)入?yún)⒌膫€數(shù)和類型要近跟著的一致,這不是一個簡單的事情。

首先,對于函數(shù)來說,入?yún)⑹遣淮_定,從 0 ... n 都是有可能的, 且類型可以同一個轉(zhuǎn)換函數(shù) m解,數(shù)量怎么解決?更嚴(yán)重的問題是函數(shù)的返回值永遠(yuǎn)只有一個。如何讓一個函數(shù)返回值,滿足一個函數(shù)入?yún)??聰明的你可能會馬上說道,那用一個 object 就可以了。

對就是這樣解決的,我們將函數(shù)入?yún)⑷糠庋b的一個 object 中,然后在前一個函數(shù)中返回同樣類型的 object.


Pipe / Flow


再看我們數(shù)學(xué)公式 z = g(f(m(y))),這是個簡單邏輯,如果復(fù)雜點: z = i(h(g(f(m(y'))))) 等復(fù)雜的嵌套邏輯我們稱之為洋蔥代碼。那能有更簡單靈活的寫法嗎?

pipeflowfp-ts提供的最常用的簡單化的組合函數(shù)。 pipe 是計算組合中等到的值,而 flow是組合的邏輯,不包括值.
用公式表示:

若 z = g(f(m(y))) = g*f*m(y)

則 pipe = g*f*m(y), flow = g*f*m

用代碼例子:

import { flow, pipe } from 'fp-ts/function';

interface Point {
    x: number,
    y: number
}

const moveRight5 = (p: Point) => ({ x: p.x - 5, y: p.y });
const moveDown5 = (p: Point) => ({ x: p.x, y: p.y - 5 });

const start = { x: 3, y: 5 };
pipe(start, moveRight5, moveDown5);
pipe(start, flow(moveRight5, moveDown5));

搞定,但并未沒有結(jié)束,因為組合還有一個條件就是可預(yù)測性或者可規(guī)劃性。

  1. 可規(guī)劃性,能夠按照既定的規(guī)則

當(dāng)我們在玩高級的托馬斯火車的軌道時,我們時預(yù)制了機(jī)關(guān)的,對于不同的火車經(jīng)過的時候按照火車自己的屬性進(jìn)入不行的路徑,而不改變軌道的配置。對應(yīng)到上面的例子,我們只能在 Happy path 下運行完成。一旦 start 是個 {} 或者 moveRight5 中出現(xiàn)了異常,這個流程就進(jìn)行不下去了。

這個問題我們在下一節(jié)繼續(xù)討論。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容