點燈坊

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

使用 compose() 組合 Function

Sam Xiao's Avatar 2020-02-22

Function 的 Argument 有兩類,一類是提供給 Function,另一類則是提供給 Callback,若要提供的 Data 為 Callback 的第一個 Argument,則適合使用 compose() 使其 Point-free。

Version

macOS Mojave 10.15.3
VS Code 1.42.1
Quokka 1.0.278
Ramda 0.27.0

map()

import { map } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = k => arr => map(x => x[k], arr)

f('price')(data) // ?

一個常見的需求,map() 所要顯示的 property 由 pr argument 傳入。

cb000

Point-free

import { map } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = k => map(x => x[k])

f('price')(data) // ?

因為 arr 在最後一個 argument,最簡單的 point-free 可將 arr argument 省略。

cb001

prop()

import { map, prop } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = k => map(prop(k))

f('price')(data) // ?

若想將 map() 的 callback 也 point-free,可使用 prop()

cb002

compose()

import { map, prop, compose } from 'ramda'

let data = [
  { title: 'FP in JavaScript', price: 100 },
  { title: 'RxJS in Action', price: 200 },
  { title: 'Speaking JavaScript', price: 300 }
]

let f = compose(map, prop)

f('price')(data) // ?

這類 f(g(x)) 的 function,很明顯的就是 function composition,可直接使用 compose() 組合 map()prop()

cb003

Conclusion

  • 若要提供的 data 為 callback 的第一個 argument,則適合使用 compose() 使其 point-free;若為第二個 argument,則適合使用 useWith() 使其 point-free

Reference

Ramda, map()
Ramda, prop()
Ramda, compose()