點燈坊

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

使用 ap 平行寫入 Side Effect

Sam Xiao's Avatar 2021-07-09

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

ap000

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 無法使用。

ap001

Conclusion

  • 一般為了平行執行 side effect 會使用 tap,但使用 ap 更為精簡
  • Sanctuary 的 ap 可使用 Array 或 Object,但 Ramda 只能用於 Array

Reference

Ramda, ap