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()
計算出平均
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。
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
Conclusion
lift()
以 higher order function 使原 function 成為 variadic function,其他 function 可依序傳入而不需要湊成 Array,其可讀性比converge()
更高