點燈坊

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

使用 apply() 將 Variadic Function 轉成接受 Array

Sam Xiao's Avatar 2021-04-22

若想將原本 Variadic Function 改成接受 Array 的 Unary Function,可使用 apply() 加以轉換。

Version

Ramda 0.27.1

Function.prototype.apply()

Math.max.apply(null, [1, 2, 3]) // ?

Math.max() 為 variadic function,若我們想改用 Array 傳入,可使用 Function.prototype.apply() 加以轉換,其中 apply() 第一個 argument 可提供 Object 取代 function 中的 this,因為 add() 沒使用 this,且我們也沒有要取代 this,因此傳入 null

apply000

apply()

import { apply } from 'ramda'

apply(Math.max)([1, 2, 3]) // ?

也可使用 Ramda 的 apply() 加以轉換。

apply()
(*… → a) → [*] → a
將 variadic function 轉換成能接受 Array

(*… → a):原本多 argument function

[*] -> a:回傳以 Array 為輸入的 function

apply001

Function Pipeline

import { pipe, map, inc, apply } from 'ramda'

let data = [1, 2, 3]

let f = pipe(
  map(inc),
  apply(Math.max)
)

f(data) // ?

apply() 價值在於可將 variadic function 轉成 unary function 方便 Function Pipeline。

使用 pipe() 組合 f()

  • map(inc):將 Array 每個 element +1

  • apply(Math.max):判斷 Array 中最大值

apply002

Conclusion

  • Ramda 的 apply() 使用上較 Function.prototype.apply() 精簡,且適合 Function Pipeline

Reference

Ramda, apply()
Samantha Ming, Passing Array as Function Arguments