Я получаю любопытное предупреждение, когда соответствующий шаблон, но только тогда, когда 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, в частности, так как я не получите предупреждение за f
без OverloadedStrings, а также не получите предупреждение для g
или h
, которые отличаются от f
только в первом шаблоне (что во всех случаях соответствует только одному конкретному значению).
Исходя из предположения, что это не ошибка в GHC, что мне не хватает?
Возможно ли, что '' '' перегружено так, что '[" "]' эквивалентно '[_]'? – Gabe
Нет, это похоже на '[" "]', а не как '[_]'. – dave4420
Вы тестировали это на GHC 7.0? –