我得到一個奇怪的警告時,模式匹配,但只啓用OverloadedStrings當...爲什麼我從GHCi得到這個警告?
$ 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.
我不明白爲什麼我得到警告爲f
與OverloadedStrings,特別是因爲我不在沒有OverloadedStrings的情況下獲得f
的警告,也不會收到g
或h
的警告,這些警告僅在第一種模式(在所有情況下僅匹配單個特定值)與f
不同。
假設這不是GHC中的錯誤,我錯過了什麼?
有沒有可能重載'''',使得[[「」]'等於'[_]'? – Gabe 2010-09-30 17:58:32
不,它的匹配就好像它是[[「」]',而不是它就是'[_]'。 – dave4420 2010-09-30 18:44:15
你在GHC 7.0上測試過了嗎? – 2010-09-30 18:56:38