[其他功能性编程语言具有此功能,例如OCaml:
match x with
| Some n when n < 10 -> ...
| Some n when n < 100 -> ...
...
或Haskell:
case x of
Just n | n < 10 -> ...
| n < 100 -> ...
...
为什么将它从榆木中移走? (早期版本具有该功能。)用榆木表达相同的惯用方式是什么?
使用if
表达式。无论如何,实际上就是所有的警卫:
case x of
_ ->
if x > 10 then
...
else
...
[在某些情况下,这确实导致重复的else
分支,否则可能被单个_
分支覆盖。解决方案与其他地方的代码重用相同:使用函数:
let
default = ...
in
case x of
Some y ->
if y > 10 then
...
else
default
_ ->
default
为什么将其删除?好吧,我无法再读懂Evan的想法,但是我的猜测是因为它使case
表达式的语法和语义变得复杂。
例如,对于初学者来说,一个常见的错误是,当编译器抱怨case
表达式为分支提供了do涵盖所有情况的保护措施时,它并不穷举[]:
case x of _ | x < 10 -> ... _ | x >= 10 -> ... -- Error: This `case` does not have branches for all possibilities -- Why u do dis, compiler?
静态模式与穷举性检查以及可以使用变量和运算符的动态防护表达式的混合使用对许多初学者来说非常混乱。许多人还使用带保护符的
case
表达式而不是any
if
表达式,只是因为case
“感觉更实用”。因此,没有警卫会使语言易于学习,但仍然具有同等的能力,但在某些相对罕见的情况下,其语言会变得更加冗长。