РЕДАКТИРОВАТЬ: В основном вы хотите это (после сопоставления преобразование обратно из (IsString b) => b
в [Char]
, но сопоставление выполняется в согласованных типах):
f :: [String] -> String
f = matchf
matchf :: (Show b, IsString a, Eq a, IsString b) => [a] -> b
matchf x = case x of [""] -> "root"; ["product", _] -> "product"; _ -> "unknown"
В противном случае GHC предупреждает о сопоставлении "" :: String
с "" :: (Data.String.IsString t) => t
(буквальный).Было бы интересно выяснить, почему (возможно, ошибка?), Учитывая, что литерал ""
по умолчанию имеет значение String:
Prelude> show ("" :: (Data.String.IsString t) => t)
<interactive>:1:0:
Warning: Defaulting the following constraint(s) to type `String'
Ваша строка должна быть производной Eq для сопоставления с шаблоном для работы с -XOverloadedStrings.Строка по-прежнему просто [Char] с -XOverloadedStrings, но строковые литералы - нет.
Другой способ сделать это без предупреждения:
test.hs:
import GHC.Exts(IsString(..))
newtype OString = OString String deriving (Eq, Show)
instance IsString OString where fromString = OString
f :: [OString] -> OString
f x = case (x :: [OString]) of {[""] -> "root"; ["product", _] -> "product"; _ -> "unknown"}
Запустите его:
$ 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> :l test.hs
[1 of 1] Compiling Main ( test.hs, interpreted )
Ok, modules loaded: Main.
*Main> f []
OString "unknown"
*Main> f [""]
OString "root"
*Main> f ["product"]
OString "unknown"
*Main> f ["product", "x"]
OString "product"
Источник: http://www.haskell.org/ghc/docs/6.12.2/html/users_guide/type-class-extensions.html#overloaded-strings