點燈坊

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

使用 boolean 實現 Ternary Operator

Sam Xiao's Avatar 2020-05-10

Ramda 要實現 Ternary Operator 要使用 ifElse,實務上還常得搭配 identityalways,Sanctuary 則提供了 boolean,只需單一 Function 即可達成需求。

Version

Sanctuary 3.1.0

?:

import { pipe, pluck, map } from 'ramda'

let data = [
  { title: 'FP in JavaScript', inStock: true },
  { title: 'Elm in Action', inStock: false },
  { title: 'Speaking JavaScript', inStock: false }
]

let f = pipe (
  pluck ('inStock'),
  map (x => x ? 'Avaliable' : 'Sold Out')
)

f (data) // ?

inStocktrue 則顯示 Avaliablefalse 則顯示 Sold Out,我們會在 map 的 callback 內使用 ?: ternary operator。

boolean000

ifElse

import { pipe, pluck, map, ifElse, identity as I, always as K } from 'ramda'

let data = [
  { title: 'FP in JavaScript', inStock: true },
  { title: 'Elm in Action', inStock: false },
  { title: 'Speaking JavaScript', inStock: false }
]

let f = pipe (
  pluck ('inStock'),
  map (ifElse (I) (K ('Avaliable')) (K ('Sold Out')))
)

f (data) // ?

若想將 map 的 callback 也 Point-free,Ramda 需使用 ifElse 實現 ?:,但因為 3 個 argument 都是 function,因此還必須搭配 IK

boolean001

boolean

import { pipe, map, prop, boolean } from 'sanctuary'

let data = [
  { title: 'FP in JavaScript', inStock: true },
  { title: 'Elm in Action', inStock: false },
  { title: 'Speaking JavaScript', inStock: false }
]

let f = pipe ([
  map ( prop ('inStock')),
  map ( boolean ('Sold Out') ('Avaliable'))
])

f (data) // ?

Sanctury 雖然也提供 ifElse,其 signature 與 Ramda 完全相同,但 boolean 更為好用,只需直接提供 falsetrue 所回傳 value 即可,可讀性更高也更精簡。

boolean
a -> a -> Boolean -> a
?: ternary operator 的 function 版本

a:當 false 的回傳值

a:當 true 的回傳值

Boolean:data 為 Boolean

a:最後回傳值

boolean002

Conclusion

  • ?: ternary operator 經常會使用到,而 Sanctuary 的 boolean 遠比 Ramda 的 ifElse 精簡,實務上推薦使用

Reference

Sanctuary, boolean