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

时间:2015-04-16 22:18:14

标签: haskell

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

ghci> :t otherwise
otherwise :: Bool

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

ghci> case [] of otherwise -> "!?"
"!?"

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

2 个答案:

答案 0 :(得分:16)

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

为了清楚起见:标识符otherwise在这里并不特别。代码也可以是x -> "!?"。此外,由于实际上从未使用绑定,因此使用_来避免使用未使用的标识符会更有意义。警告,并使读者明白价值无关紧要。

答案 1 :(得分:9)

  

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

一个例子:

fact n acc
  | n == 0 = acc
  | otherwise = fact (n-1) $! (acc * n)

由于otherwiseTrue,所以第二名后卫将永远成功。

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