Haskell的`otherwise`是`_`的同义词?

Yel*_*ika 8 haskell

我最近遇到了一段代码,它使用Haskell otherwise在列表上进行模式匹配.这让我很奇怪,因为:

ghci> :t otherwise
otherwise :: Bool
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了以下内容:

ghci> case [] of otherwise -> "!?"
"!?"
Run Code Online (Sandbox Code Playgroud)

我也尝试了不同类型的各种其他模式,并-XNoImplicitPrelude打开(otherwise从范围中删除),它仍然有效.这应该发生吗?这记录在哪里?

sep*_*p2k 16

它不等同于_,它等同于任何其他标识符.也就是说,如果在Haskell中将标识符用作模式,则模式始终匹配,并且匹配的值绑定到该标识符(与_它始终匹配的位置不同,但丢弃匹配的值).

需要明确的otherwise是:标识符在这里并不特别.代码也可以x -> "!?".此外,由于从未实际使用绑定,因此使用_避免"未使用的标识符"警告更有意义,并使读者明白该值无关紧要.

  • `case []否则 - >(否则,"!?")`是`([],"!?")`是一个例子,展示了绑定在这种情况下的工作原理. (5认同)
  • 只要记住`otherwise = True`。有些人甚至在他们的代码中使用“True”而不是“otherwise”,这有时会读起来很奇怪,但也避免了意外绑定。 (2认同)

dfe*_*uer 9

只是因为没有人说过,否则应该被用作守卫表达,而不是模式.案例......拍拍| ...... - > ... | 否则 - > ......现在它的定义为True非常重要. - 里德巴顿

一个例子:

fact n acc
  | n == 0 = acc
  | otherwise = fact (n-1) $! (acc * n)
Run Code Online (Sandbox Code Playgroud)

由于otherwiseIS True,即第二后卫总是会成功的.

请注意,otherwise在模式中使用(与警卫相对)可能会使人感到困惑.如果在启用适当警告的情况下运行GHC,它也会触发名称阴影警告.