點燈坊

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

converge(f, [g, I]) 與 chain(f, g) 等效性

Sam Xiao's Avatar 2021-06-12

在重構階段常會出現 converge(f, [g, I]) Pattern,此時可重構成 chain(f, g)

Version

Ramda 0.27.1

append()

import { append, head } from 'ramda'

let data = [1, 2, 3]

let f = x => append(head(x), x)

f(data) // ?

若我們希望將傳入 Array 的第一個 element 加到原 Array 最後,可使用 head()append()

  • head():取得第一個 element
  • append():將 value 加到 Array 最後

chain000

converge()

import { converge, append, head, identity as I } from 'ramda'

let data = [1, 2, 3]

let f = converge(append, [head, I])

f(data) // ?

可使用 converge() 組合使其 Point-free。

可發現出現 converge(f, [g, I]) pattern。

chain001

chain()

import { append, head, chain } from 'ramda'

let data = [1, 2, 3]

let f = chain(append, head)

f(data) // ?

可將 converge(f, [g, I]) 重構成 chain(f, g)

chain002

Conclusion

  • 可能一時看不出該使用 chain(),但只要看到 converge(f, [g, I]) 就可重構成 chain()