dav*_*420 6 warnings haskell case-statement ghc overloaded-strings
模式匹配时我收到一个好奇的警告,但只有当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.
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我会收到fOverloadedStrings 的警告,特别是因为f没有OverloadedStrings 我没有得到警告,也没有得到警告,g或者只是在第一个模式中h有所警告f(总体而言) case只匹配一个特定的值).
假设这不是GHC中的错误,我错过了什么?
这是一个稍微简单的示例,显示了 GHC 6.12.3 中的相同问题:
f :: String -> Bool
f "" = True
f "a" = False
g :: String -> Bool
g "" = True
g "aa" = False
Run Code Online (Sandbox Code Playgroud)
仅g获取与-XOverloadedStrings. 我认为这必须是一个错误。