If statement MultiWayIf和经典卫士之间有什么区别?
如果使用If statement MultiWayIf和经典卫士之间有什么区别?,if-statement,haskell,If Statement,Haskell,如果使用|防护无法实现扩展,那么多路If扩展提供了什么,反之亦然 例如,可以编写与相同的函数 f x | x == 0 = -1 | otherwise = x 或 除了所使用的语法糖之外,我看不出这两个例子之间有任何区别。是否存在我应该选择其中一种而不是另一种的情况 如果不应使用代替功能防护装置,则应使用多路。如果你能使用警卫,你应该这样做。但是多道如果也可以在表达式的中间使用,很像Case< /C> >,例如: f x = "The argument is " ++
|
防护无法实现扩展,那么多路If
扩展提供了什么,反之亦然
例如,可以编写与相同的函数
f x | x == 0 = -1
| otherwise = x
或
除了所使用的语法糖之外,我看不出这两个例子之间有任何区别。是否存在我应该选择其中一种而不是另一种的情况 如果不应使用代替功能防护装置,则应使用多路
。如果你能使用警卫,你应该这样做。但是多道<代码>如果也可以在表达式的中间使用,很像Case< /C> >,例如:
f x = "The argument is " ++
if | x > 0 -> "positive"
| x < 0 -> "negative"
| otherwise -> "zero"
f x=“参数为”++
如果| x>0->“正”
|x<0->“负”
|否则->“零”
就我个人而言,我确实觉得这个特定示例的清晰性有点可疑,但这就是区别所在。假设您有一个嵌套严重的if
语句,如
if c1 then a1
else if c2 then a2
else if c3 then a3
else if c4 then a4
else if c5 then a5
else a6
MultiWayIf
让您可以更简洁地编写以下内容:
if | c1 -> a1
| c2 -> a2
| c3 -> a3
| c4 -> a4
| c5 -> a5
| otherwise -> a6
此外,尽管每个if
表达式必须提供一个值,无论条件是真是假(if c,则a
不是有效的if
表达式,因为缺少else
),但多路if
不必是穷举的;可以省略,否则
。这只是一种句法放松;如果没有一个条件是真的,那么在计算表达式后仍然会引发异常。正如其他人所解释的,这实际上只是语法上的方便。您可以非常轻松地将任何多路if
转换为等价的case
表达式
if
| c1 -> e1
| c2 -> e2
...
正好相当于
case () of
_ | c1 -> e1
| c2 -> e2
...
像往常一样,()
表示“这里没有什么可看的”,而\uu
表示“我们反正也不看。”目的是简化嵌套严重的if
表达式,而不是取代现有的函数保护。
case () of
_ | c1 -> e1
| c2 -> e2
...