ap
除了用來將 Apply 與包進 Apply 的 Function 綁定外,也常用來平行執行 Side Effect。
Version
Ramda 0.27.1
Array
import { ap } from 'ramda'
import { log, error } from 'wink-fp'
let data = [1]
ap ([log, error]) (data)
若是單一 value 想平行執行 side effect,需將 value 包進 Array 內,且 function 也要包在 Array 內一起傳進 ap
。
ap
Apply f => f (a -> b) -> f a -> f b
將 Apply 與包進 Apply 的 function 綁定改變 Apply
f (a -> b)
:包進 Apply 的 unary function
f a
:data 為 Apply
f b
:回傳新 Apply
之所以要將 value 包進 Array,是為了配合 function 要包進 Array,且
ap
要求 value 與 function 都需包在 Apply 內,也就是相同 typeclass
Object
import { ap } from 'ramda'
import { log, error } from 'wink-fp'
let data = { x: 1, y: 2 }
ap ({ x: log, y: error }) (data)
若有多個 value,且欲各自平行執行不同 side effect,理論上需將 value 包進 Object,且 function 也要包在 Object 內一起傳進 ap
,function 只會影響相同 key 的 property。
此在 Sanctuary 可正常執行,可惜在 Ramda 無法使用。
Conclusion
- 一般為了平行執行 side effect 會使用
tap
,但使用ap
更為精簡 - Sanctuary 的
ap
可使用 Array 或 Object,但 Ramda 只能用於 Array