實務上常須對 Function 的 Argument 先經過處理後,在傳給主要 Function 運算,此時可使用 juxt()
先處理,再以 pipe()
組合其他 Function。
Version
Ramda 0.27.1
range()
import { juxt } from 'ramda'
let range = juxt([Math.min, Math.max])
range(3, 4, 9, -3) // ?
range()
為 variadic function,可從輸入 argument 中取得最大最小值,並以 Pair 回傳。
使用 juxt()
將 argument 先經過 Max.min()
與 Math.max()
處理,因爲 juxt()
結果為 Array,因此 function 需包在 []
內。
juxt()
[(a, b, …, m) → n] → (a, b, …, m) → [n]
[(a, b, …, m) → n]
:傳入 Function Array,其 signature 沒有限制
(a, b, …, m)
:data 的 artity 沒有限制,但必須與 Function Array 中的 function signature 相同
[n]
:回傳 Array
avg()
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
Conclusion
juxt()
、converge()
與lift()
使用情境有些類似,有些可以相互取代juxt()
回傳為 Array,常需搭配apply()
讓一般 function 能接受 Array