16

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型制約付き) と、引数に厳密な型シグネチャを持つ任意の関数に分割する必要がありますか?

4

1 に答える 1

32

オンにすることもできExtendedDefaultRulesます ( https://www.fpcomplete.com/user/snoyberg/random-code-snippets/overloadedstrings-defaults ):

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ExtendedDefaultRules #-}
import Data.Text (Text, pack)

newtype JSString = JSString Text
    deriving Show

class ToJSString a where
    toJSString :: a -> JSString
instance ToJSString [Char] where
    toJSString = toJSString . pack
instance ToJSString Text where
    toJSString = JSString

someFunction :: ToJSString a => a -> IO ()
someFunction = print . toJSString

main :: IO ()
main = someFunction "Hello World"

EDITdefault (Text)モジュールの先頭に追加して、デフォルトTextの代わりに使用することもできStringます。

于 2014-11-06T12:30:44.213 に答える