點燈坊

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

使用 cond() 實現 Switch Case

Sam Xiao's Avatar 2020-09-04

寫程式免不了要使用判斷邏輯,若要實現 switch 根據不同條件執行不同 function,Ramda 提供了 cond()

Version

macOS Catalina 10.15.6
Ramda 0.27.0

Imperative

let data = 1

let f = x => {
  let result = 0

  switch(x) {
    case 1: 
      result = 10
      break
    case 2:
      result = 20
      break
    default:
      result = 30
      break
  }

  return result
}

f(1) // ?
f(2) // ?
f(3) // ?

若條件中彼此互斥,Imperative 會使用 switch case

cond000

cond()

import { cond, equals, always, T } from 'ramda'

let data = 1

let f = cond([
  [equals(1), always(10)],
  [equals(2), always(20)],
  [T, always(30)]
])

f(1) // ?
f(2) // ?
f(3) // ?

Ramda 提供 cond() 取代 switch case

cond()
[[(*… → Boolean),(*… → *)]] → (*… → *)
根據條件回傳不同 function,相當於 Imperative 的 switch case

[[(*… → Boolean),(*… → *)]]:array of array,每個小 array 包含 predicate 與要執行 function

(*… → *):回傳所選擇 function

另外 T() 相當於 () => true,由於 always true,相當於 switch casedefault

cond001

Conclusion

  • ifElse()when()unless() 都只適合單一條件,若要多條件就要靠 cond()
  • cond() 特色是每個 case 與其回傳值都在同一個 Array 內,第一個 element 是判斷條件,但因為是 function 所以可 point-free;第二個 element 是執行 function,儘管只回傳 value,也必須以 always() 包成 function

Reference

Ramda, cond()