generated at
OverloadedStrings
バニラのHaskellでは文字列リテラルはStringとなるが、それを多相化してTextByteStringなどにもできるGHC拡張 IsString クラスのインスタンスを定義することによって好きな型に対応でき、リテラル "foo" fromString "foo" :: IsString a => a へと脱糖される。
haskell
class IsString a where -- Data.String fromString :: String -> a
いくつかの落とし穴に気をつければ、素直で扱いやすく、実用的なHaskellプログラミングには必須レベルの拡張だ。

罠その0: ByteStringとマルチバイト文字
ByteStringのIsStringインスタンスはマルチバイト文字に対応していない。エンコードが違うとかいうレベルの話ではなく、各文字を Word8 にキャストするので単に壊れる。自分で encodeUTF8 のような関数を呼ぶ必要がある。
haskell
Prelude Data.ByteString> "こんにちは" :: ByteString "S\147kao"

罠その1: TypeApplications非対応
GHC 8から導入されたTypeApplicationsは、型パラメータを @Int のようにして束縛でき、型推論をコントロールできる便利な機能だ。リテラルのオーバーロードとシナジーがありそうだが、実はリテラルと組み合わせて使うことはできない。ghc-proposalsでTypeApplications for Overloaded Literalsという提案がされたが、型システムの制限により却下された。

そのため、aesonでJSONを構築したいとき、以下のような書き方はできない ("lorem ipsum :: Text") のような伝統的な記法を使わなければならない。
haskell
foo = object [ "foo" .= 114514 @ Int , "bar" .= "lorem ipsum" @ Text ]