ᆼᆺᆼ*_*ᆼᆺᆼ 5 pattern-matching elm
其他函数式编程语言也有这个特性,比如OCaml:
match x with
| Some n when n < 10 -> ...
| Some n when n < 100 -> ...
...
Run Code Online (Sandbox Code Playgroud)
或哈斯克尔:
case x of
Just n | n < 10 -> ...
| n < 100 -> ...
...
Run Code Online (Sandbox Code Playgroud)
为什么从 Elm 中删除它?(早期版本显然有它。)
在 Elm 中表达相同内容的惯用方式是什么?
使用if表达式。反正所有的守卫都是这样:
case x of
_ ->
if x > 10 then
...
else
...
Run Code Online (Sandbox Code Playgroud)
在某些情况下,这确实会导致重复的else分支,否则可能会被单个_分支覆盖。对此的解决方案与其他地方的代码重用相同:使用函数:
let
default = ...
in
case x of
Some y ->
if y > 10 then
...
else
default
_ ->
default
Run Code Online (Sandbox Code Playgroud)
(注意default这里会严格求值。如果计算()开销很大,就加一个哑参数来懒惰求值。)
为什么被删除了?好吧,我再也无法像你一样读懂 Evan 的想法了,但我的猜测是因为它使case表达式的语法和语义都变得复杂了。
例如,对于初学者常见的错误是会感到困惑时,编译器会抱怨,一个case时,他们已经提供分支与警卫表达并不详尽做到全覆盖的情况下:
case x of
_ ->
if x > 10 then
...
else
...
Run Code Online (Sandbox Code Playgroud)
静态模式与详尽检查和可以使用变量和运算符的动态保护表达式的混合对许多初学者来说非常混乱。许多人还使用case带有保护的表达式而不是任何 if表达式,只是因为case“感觉更实用”。
因此,没有守卫使得语言更容易学习并且仍然具有同样的能力,代价是在一些相对罕见的情况下稍微冗长。