为什么要从榆树中撤走警卫?

问题描述 投票:2回答:1

[其他功能性编程语言具有此功能,例如OCaml:

match x with
| Some n when n < 10 -> ...
| Some n when n < 100 -> ...
...

或Haskell:

case x of 
  Just n | n < 10 -> ...
         | n < 100 -> ...
  ...

为什么将它从榆木中移走? (早期版本具有该功能。)用榆木表达相同的惯用方式是什么?

pattern-matching elm
1个回答
4
投票

使用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“感觉更实用”。

因此,没有警卫会使语言易于学习,但仍然具有同等的能力,但在某些相对罕见的情况下,其语言会变得更加冗长。

© www.soinside.com 2019 - 2024. All rights reserved.