點燈坊

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

使用 ifElse() 實現多層 if else

Sam Xiao's Avatar 2020-09-04

FP 不單只能用在 Array 與 Object 而已,事實上原本 if else statement 也能以 ifElse() 取代,連多層 if else 也能以 ifElse() 實現。

Version

macOS Catalina 10.15.6
Ramda 0.27.1

Imperative

let data = 1

let f = x => {
  if (x === 1) return 10 
  else if (x === 2) return 20
  else return 30
}

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

Imperative 會使用 ifelse ifelse 實現多層 if else

ifelse000

Nested ?:

let data = 1

let f = x => (x === 1) ? 10 : (x === 2) ? 20 : 30

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

也可使用 ?: 實現多層 if else

ifelse001

ifElse()

import { pipe, ifElse, always, equals } from 'ramda'

let data = 1

let g = ifElse(equals(2), always(20), always(30))
let f = ifElse(equals(1), always(10), g)

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

FP 會使用 ifElse()

  • 第一個 argument 相當於 if else(),可使用 equals() 使其 point-free
  • 第二個 argument 的 function 當 true 時執行
  • 第三個 argument 的 function 當 false 時執行

由於 false 又必須 nested if else 判斷,在 FP 會抽出新的 g() 使用 ifElse() 判斷。

ifelse002

Conclusion

  • ifElse() 特色是三個 argument 都是 function,因此第一個 argument 能以 function 加以 point-free,後面兩個 argument 儘管只想回傳 value,也必須以 always() 包成 function

Reference

Ramda, ifElse()