When the OverloadedStrings pragma is enabled, it changes the definition of String
from:
type String = [Char]
to:
IsString a -> a
with IsString
defined as:
class IsString a where
fromString :: String -> a
This means that strings are now higher-kinded types and, in order to use them, we need to make them concrete by either (a) explicitly typing what we intend them to be, or (b) using the ExtendedDefaultRules
languages extension.
Furthermore, if we are only interested in using a package’s IsString
instance for use but will not use the package itself, we can import the package and hide all members to gain access to the IsString
instance. This would look like the following:
{-# LANGUAGE OverloadedStrings #-}
import Data.ByteString.Char8 () -- only get the orphaned `IsString` instance