我在 Haskell 中有这个功能:
test :: (Eq a) => a -> a -> Maybe a
test a b
| a == b = Just a
test _ _ = Nothing
这是我尝试使用不同输入的函数时得到的结果:
ghci>test 3 4
Nothing
ghci>test 3 3
Just 3
根据 Real World Haskell 的说法,第一种模式是无可辩驳的。但似乎test 3 4
没有失败第一个模式,并且匹配第二个。我预计会出现某种错误——也许是“非详尽的守卫”。那么这里到底发生了什么,有没有办法在这种意外发生的情况下启用编译器警告?