使用重载字符串

时间:2014-11-06 11:31:18

标签: haskell language-extension ghcjs overloaded-strings

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值。

问题是,有没有办法将没有类型签名的所有字符串文字默认为TextString?或者我应该将我的代码拆分为一般函数(使用ToJSString类型约束)和任意函数,它们的参数具有严格的类型签名?

1 个答案:

答案 0 :(得分:26)

您也可以启用ExtendedDefaultRuleshttps://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"

编辑您可能还希望在模块顶部添加default (Text),以使其默认使用Text而不是String