點燈坊

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

使用 juxt() 讓 Argument 先經過 Function 處理

Sam Xiao's Avatar 2020-11-21

實務上常須對 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

juxt000

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

juxt001

Conclusion

  • juxt()converge()lift() 使用情境有些類似,有些可以相互取代
  • juxt() 回傳為 Array,常需搭配 apply() 讓一般 function 能接受 Array

Reference

Ramda, juxt()