有不少 Function 的 Arguemtn 要求 Array,如 pick()
、project()
,此時可先使用 of()
先建立 Array 之後再傳給 Function。
Version
macOS Catalina 10.15.3
VS Code 1.42.1
Quokka 1.0.277
Ramda 0.27.0
pick()
import { map, pick } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
let f = v => map(pick([v]))
f('price')(data) // ?
當使用 pick()
產生 map()
所需的 callback 時,其 argument 要求為 array,可使用 []
operator 產生 array。
of()
import { map, pick, compose } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
let of = v => [v]
let f = compose(map, pick, of)
f('price')(data) // ?
但只要使用 operator 都會遇到一個問題:無法 point-free。
因為 compose()
需要的是 function。
因此可自行建立 of()
產生 array。
Ramda
import { map, pick, compose, of } 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, pick, of)
f('price')(data) // ?
Ramda 已經內建 of()
可直接使用。
of()
a → [a]
將任意值包成 array
project()
import { project } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
let f = v => project([v])
f('price')(data) // ?
map(pick())
可由 project()
取代,但 argument 要求依然是 array。
Function Composition
import { compose, project, of } from 'ramda'
let data = [
{ title: 'FP in JavaScript', price: 100 },
{ title: 'RxJS in Action', price: 200 },
{ title: 'Speaking JavaScript', price: 300 }
]
let f = compose(project, of)
f('price')(data) // ?
也可使用 compose()
組合 project()
與 of()
。
Conclusion
- 實務上不會使用
of()
建立 array,但會用於 callback 中需要 array argument 時組合of()
使用
Reference
Ramda, of()
Ramda, map()
Ramda, pick()
Ramda, project()
Ramda, compose()