OverloadedStrings
拡張機能は非常に便利ですが、いくつかの欠点があります。次の関数定義を検討してください。
someFunction :: ToJSSTring a => a -> IO ()
someFunction = js_function . toJSSTring
この場合、リテラル値を渡したい場合OverloadedStrings
は、有効になっているときに型シグネチャを明示的に追加する必要があります。
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)
この必要性の理由は非常に明白です。OverloadedStrings
厳密な型シグネチャを持つ関数にリテラル値を簡単に渡せるように設計されていると思います。これにより、開発者は値が必要なpack
場所に sを書く必要がなくなります。Text
問題は、たとえば、型シグネチャのないすべての文字列リテラルをText
、または? にデフォルト設定する方法はありますかString
? または、コードを一般的な関数 (ToJSString
型制約付き) と、引数に厳密な型シグネチャを持つ任意の関数に分割する必要がありますか?