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 везде, где значение Text необходимо.
Вопрос в том, есть ли способ, скажем, по умолчанию все строковые литералы без подписи типов к Text или String? Или я должен просто разделить мой код на общие функции (с ограничением типа ToJSString) и произвольными, которые имеют строгие сигнатуры типов для своих аргументов?