当启用OverloadedStrings时,我在模式匹配时收到一个奇怪的警告...
$ ghci -Wall
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let f x = case (x :: [String]) of {[""] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
Prelude> :q
Leaving GHCi.
$ ghci -Wall -XOverloadedStrings
GHCi, version 6.12.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> let f x = case (x :: [String]) of {[""] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
<interactive>:1:10:
Warning: Pattern match(es) are overlapped
In a case alternative: [""] -> ...
Prelude> let g x = case (x :: [String]) of {[] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
Prelude> let h x = case (x :: [String]) of {["oops"] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
Prelude> :q
Leaving GHCi.
我不理解为什么在使用OverloadedStrings时会针对f
发出警告,特别是因为在没有使用OverloadedStrings时我没有收到关于f
的警告,并且对于g
或h
也没有警告,它们与f
的唯一区别在于第一个模式(在所有情况下只匹配单个特定值)。
假设这不是GHC中的错误,那我可能遗漏了什么?
""
进行重载,使得[""]
等同于[_]
? - Gabe[""]
而不是[_]
。 - dave4420