點燈坊

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

使用 lift() 取代 converge()

Sam Xiao's Avatar 2020-11-16

converge() 允許我們輸入單一 Argument 時,先同時使用多個 Branching Function 處理成多 Argument 再傳入 Converging Function,事實上也可使用 lift() 實踐。

Version

Ramda 0.27.1

avg()

import { divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = a => divide(sum(a), length(a))

avg(data) // ?

avg() 可對 Array 所有 element 加總並取平均:

  • 傳入 Array 後先使用 sum() 計算總和
  • 再使用 length() 取得 element 個數
  • 最後使用 divide() 計算出平均

lift000

converge()

import { converge, divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = converge(
  divide, [sum, length]
)

avg(data) // ?

也可使用 converge() 使 avg() 能 Point-free。

lift001

lift()

import { lift, divide, sum, length } from 'ramda'

let data = [1, 2, 3]

let avg = lift(divide)(sum, length)

avg(data) // ?

lift() 也能實作 converge(),但 signature 不太一樣:

  • 使用 lift()divide() 改變 signature
  • converge() 須以 Array 傳入 function,lift() 則以 variadic function 傳入 function

lift002

Conclusion

  • lift() 以 higher order function 使原 function 成為 variadic function,其他 function 可依序傳入而不需要湊成 Array,其可讀性比 converge() 更高

Reference

Ramda, converge()
Ramda, lift()