點燈坊

失くすものさえない今が強くなるチャンスよ

使用 bind() 實現 Partial Application

Sam Xiao's Avatar 2020-04-04

Partial Application 是當 Function 提供不足 Argument 時,會回傳以剩下 Argument 所構成的新 Function,這種看似神奇的概念,事實上 bind() 就能實現。

Version

macOS Catalina 10.15.4
VS Code 1.43.2
Quokka 1.0.285
ECMAScript 2015

Ramda

import { add } from 'ramda'

let add5 = add(5)

add5(2) // ?

Ramda 所提供的 function 都支援 partial application,如 add() 原本需要兩個 argument,若僅提供 5 亦可回傳新的 add5() 而不會 runtime 錯誤。

bind000

bind()

let add = (x, y) => x + y

let add5 = add.bind(null, 5)

add5(2)  // ?

add() 為普通 function,可使用 Array.prototype.bind() 實現 partial application,第一個 argument 因為沒有要取代 this,因此傳入 null 即可,之後可傳入 argument,bind() 將以剩下的 argument 成為新的 function。

bind001

Conclusion

  • Partial application 為 FP 重要概念,也是 point-free 與 function composition 的理論基礎,事實上 bind() 已經支援 partial application,只是語法不夠漂亮而已