OverloadedStrings
バニラのHaskellでは文字列リテラルはStringとなるが、それを多相化してTextやByteStringなどにもできるGHC拡張。IsStringクラスのインスタンスを定義することによって好きな型に対応でき、リテラル"foo"がfromString "foo" :: IsString a => a へと脱糖される。 code:haskell
class IsString a where -- Data.String
fromString :: String -> a
いくつかの落とし穴に気をつければ、素直で扱いやすく、実用的なHaskellプログラミングには必須レベルの拡張だ。
罠その0: ByteStringとマルチバイト文字
ByteStringのIsStringインスタンスはマルチバイト文字に対応していない。エンコードが違うとかいうレベルの話ではなく、各文字をWord8にキャストするので単に壊れる。自分でencodeUTF8のような関数を呼ぶ必要がある。
code:haskell
Prelude Data.ByteString> "こんにちは" :: ByteString
"S\147kao"
罠その1: TypeApplications非対応
そのため、aesonでJSONを構築したいとき、以下のような書き方はできない。("lorem ipsum :: Text")のような伝統的な記法を使わなければならない。 code:haskell
foo = object
[ "foo" .= 114514 @ Int
, "bar" .= "lorem ipsum" @ Text
]