計算 Array 的平均值為常見需求,但 Ramda 並沒有內建 avg()
,但可自行組合。
Version
Ramda 0.27.1
converge()
import { converge, divide, sum, length } from 'ramda'
let data = [1, 2, 3]
let avg = converge(
divide, [sum, length]
)
avg(data) // ?
- 使用
sum()
計算 Array 總和 - 使用
length()
計算 Array 的 element 個數 - 使用
converge()
分別將sum()
與length()
結果傳給divide()
計算平均
lift()
import { lift, divide, sum, length } from 'ramda'
let data = [1, 2, 3]
let avg = lift(divide)(sum, length)
avg(data) // ?
- 使用
lift()
對divide()
改變 signature converge()
須以 Array 傳入 function,lift()
則以 variadic function 傳入 function
juxt()
import { pipe, juxt, apply, divide, sum, length } from 'ramda'
let data = [1, 2, 3]
let avg = pipe(
juxt([sum, length]),
apply(divide)
)
avg(data) // ?
- 使用
juxt()
將 Array 先將過sum()
與length()
處理 - 因為
juxt()
回傳為 Array,所以使用apply()
將divide()
改變能接受 Array
Wink-fp
import { avg } from 'wink-fp'
let data = [1, 2, 3]
avg(data) // ?
Wink-fp 已經內建 avg()
可直接使用。
Conclusion
avg()
雖然是簡單應用,但可分別使用converge()
、lift()
與juxt()
實現
Reference
stackoverflow, How to convert simple average function in javascript to pointfree form using Ramda ?