MultiWayIf和经典卫兵有什么区别?

rad*_*row 2 haskell if-statement

MultiWayIf使用|警卫无法实现的扩展提供什么,反之亦然?

例如,可以编写相同的函数

f x | x == 0 = -1
    | otherwise = x
Run Code Online (Sandbox Code Playgroud)

要么

f x = if | x == 0 -> -1
         | otherwise -> x
Run Code Online (Sandbox Code Playgroud)

除了使用的语法糖之外,我没有看到这两个例子之间有任何区别.在哪些情况下我应该更喜欢一个而不是另一个?

Fyo*_*kin 8

if不应该使用Multiway 而不是功能保护.如果你可以使用警卫,你应该这样做.但是多路径if也可以用在表达式的中间,就像case,例如:

f x = "The argument is " ++ 
         if | x > 0 -> "positive"
            | x < 0 -> "negative"
            | otherwise -> "zero"
Run Code Online (Sandbox Code Playgroud)

就个人而言,我确实发现这个具体例子的清晰度值得怀疑,但这就是区别.