[英]F# version of haskell pattern match
我如何干凈利落地在F#中使用它?
add 1 2 x = 3 + x
add 1 x y = 1 + x + y
add z x y = z + x + y
您不能重載函數本身,但可以直接使用模式匹配:
let add z x y = // curried multiple parameters
match z, x, y with // convert to three-tuple to match on
| 1, 2, x -> 3 + x
| 1, x, y -> 1 + x + y
| z, x, y -> z + x + y
用法如預期: add 1 2 3
如果你願意使用元組作為參數(即放棄currying和部分應用),你甚至可以用簡寫來寫它:
let add = // expect three-tuple as first (and only) parameter
function // use that one value directly to match on
| 1, 2, x -> 3 + x
| 1, x, y -> 1 + x + y
| z, x, y -> z + x + y
現在用法是: add (1, 2, 3)
這純粹是語法上的。 像Haskell,Standard ML和Mathematica這樣的語言允許你寫出不同的匹配案例,就像它們是不同的函數一樣:
factorial 0 = 1
factorial 1 = 1
factorial n = n * factorial(n-1)
而像OCaml和F#這樣的語言要求您擁有單個函數定義並在其正文中使用match
或等效:
let factorial = function
| 0 -> 1
| 1 -> 1
| n -> n * factorial(n-1)
請注意,您不必使用此語法反復復制函數名稱,並且可以更輕松地考慮匹配案例:
let factorial = function
| 0 | 1 -> 1
| n -> n * factorial(n-1)
正如衙門寫的那樣,在F#中使用let fab = match a, b with ...
在經典的紅黑樹實現中,我發現標准ML和Haskell中的函數名稱和右側的重復非常難看:
balance :: RB a -> a -> RB a -> RB a
balance (T R a x b) y (T R c z d) = T R (T B a x b) y (T B c z d)
balance (T R (T R a x b) y c) z d = T R (T B a x b) y (T B c z d)
balance (T R a x (T R b y c)) z d = T R (T B a x b) y (T B c z d)
balance a x (T R b y (T R c z d)) = T R (T B a x b) y (T B c z d)
balance a x (T R (T R b y c) z d) = T R (T B a x b) y (T B c z d)
balance a x b = T B a x b
與等效的OCaml或F#相比:
let balance = function
| B, z, (T(R, y, T(R, x, a, b), c) | T(R, x, a, T(R, y, b, c))), d
| B, x, a, (T(R, z, T(R, y, b, c), d) | T(R, y, b, T(R, z, c, d))) ->
T(R, y, T(B, x, a, b), T(B, z, c, d))
| a, b, c, d -> T(a, b, c, d)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.