这纯粹是句法。 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)
正如 yamen 所写,在 F# 中使用 let f a b = 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)