我最近遇到了一段代码,它使用Haskell的otherwise
来对列表进行模式匹配。这让我很奇怪,因为:
ghci> :t otherwise
otherwise :: Bool
所以,我尝试了以下内容:
ghci> case [] of otherwise -> "!?"
"!?"
我还尝试了其他各种不同类型的模式,并且启用了-XNoImplicitPrelude
(从范围中移除otherwise
),它仍然有效。这应该发生吗?这记录在哪里?
答案 0 :(得分:16)
它不等同于_
,它等同于任何其他标识符。也就是说,如果标识符在Haskell中用作模式,则模式始终匹配,匹配的值绑定到该标识符(与_
不同,它始终匹配,但匹配的值将被丢弃)。
为了清楚起见:标识符otherwise
在这里并不特别。代码也可以是x -> "!?"
。此外,由于实际上从未使用绑定,因此使用_
来避免使用未使用的标识符会更有意义。警告,并使读者明白价值无关紧要。
答案 1 :(得分:9)
因为没有人说过,否则应该被用作守卫表达,而不是模式。案例......拍拍| ... - > ...... |否则 - > ......现在它的定义是真的很重要。 - 里德巴顿
一个例子:
fact n acc
| n == 0 = acc
| otherwise = fact (n-1) $! (acc * n)
由于otherwise
是True
,所以第二名后卫将永远成功。
请注意,在模式中使用otherwise
(与警卫相对)可能会让人感到困惑。如果在启用适当警告的情况下运行GHC,它也会触发名称阴影警告。