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
    ...