gpt4 book ai didi

pattern-matching - 为什么从 Elm 中移除了案件 guard ?

转载 作者:行者123 更新时间:2023-12-03 16:03:25 25 4
gpt4 key购买 nike

其他函数式编程语言也有这个特性,比如OCaml:

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

或 haskell :

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

为什么从 Elm 中删除它? (早期版本显然有它。)
在榆树中表达相同的惯用方式是什么?

最佳答案

使用 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

(注意这里的 default 会被严格求值。如果计算量很大,可以加上 () 作为哑参数来懒惰求值。)

为什么被删除了?好吧,我再也无法像你一样读懂 Evan 的想法了,但我的猜测是因为它使 case 的语法和语义都变得复杂了。表达式。

例如,初学者的一个常见错误是在编译器提示 case 时感到困惑。当他们为分支提供覆盖所有情况的保护时,表达式并不详尽:

case x of 
_ | x < 10 -> ...
_ | x >= 10 -> ...
-- Error: This `case` does not have branches for all possibilities
-- Why u do dis, compiler?

静态模式与详尽检查和可以使用变量和运算符的动态保护表达式的混合对许多初学者来说非常困惑。许多人还使用 case带有 guard 而不是任何的表达式 if表达,只是因为 case “感觉更实用”。

因此,没有守卫使得语言更容易学习并且仍然具有同样的能力,代价是在一些相对罕见的情况下稍微更冗长。

关于pattern-matching - 为什么从 Elm 中移除了案件 guard ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59123851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com