我最近遇到了一段代码,它使用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 -> "!?"
.此外,由于从未实际使用绑定,因此使用_
避免"未使用的标识符"警告更有意义,并使读者明白该值无关紧要.
只是因为没有人说过,否则应该被用作守卫表达,而不是模式.案例......拍拍| ...... - > ... | 否则 - > ......现在它的定义为True非常重要. - 里德巴顿
一个例子:
fact n acc
| n == 0 = acc
| otherwise = fact (n-1) $! (acc * n)
Run Code Online (Sandbox Code Playgroud)
由于otherwise
IS True
,即第二后卫总是会成功的.
请注意,otherwise
在模式中使用(与警卫相对)可能会使人感到困惑.如果在启用适当警告的情况下运行GHC,它也会触发名称阴影警告.