點燈坊

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

使用 list() 將值轉成 Array

Sam Xiao's Avatar 2021-04-22

多 Argument Function 並不適合 Function Pipeline,實務上會透過 apply() 轉成 Unary Function,並透過 list() 準備 Argument。

Version

Wink-fp 1.27.1

apply()

import { pipe, always, apply } from 'ramda'

let add = (x, y, z) => x + y + z

pipe(
  always([1, 2, 3]),
  apply(add)
)() // ?

第 3 行

let add = (x, y, z) => x + y + z

add() 為 ternary function 並不適合 Function Pipeline。

第 5 行

pipe(
  always([1, 2, 3]),
  apply(add)
)() // ?

組合出 IIFE:

  • always([1, 2, 3]):將 argument 以 Array 呈現
  • apply(add):將 add() 轉成 unary function

list000

list()

import { pipe, apply, thunkify } from 'ramda'

let add = (x, y, z) => x + y + z

let list = thunkify(Array.of)

pipe(
  list(1, 2, 3),
  apply(add)
)() // ?

第 5 行

let list = thunkify(Array.of)

原生的 Array.of() 就可將值轉成 Array,使用 thunkify() 轉成 list() 方便 Function Pipeline。

第 7 行

pipe(
  list(1, 2, 3),
  apply(add)
)() // ?

組合出 IIFE:

  • list(1, 2, 3):將 argument 以 Array 回傳
  • apply(add):將 add() 轉成 unary function

list001

Wink-fp

import { pipe, apply } from 'ramda'
import { list } from 'wink-fp'

let add = (x, y, z) => x + y + z

pipe(
  list(1, 2, 3),
  apply(add)
)() // ?

Wink-fp 已經提供 apply() 可直接使用。

list()
a... -> () -> [a...]

a...:可提供不限個數 argument

() -> [a...]:回傳新 function,而此新 function 回傳 Array

list002

Conclusion

  • 實務上常在 Function Pipeline 中使用 apply() 將多 argument function 轉成 unary function,此時可搭配 list() 傳入 argument,會比使用 always() 精簡

Reference

Ramda, apply()
Ramda, thunkify()