Haskell 使用重载字符串

Haskell 使用重载字符串,haskell,language-extension,ghcjs,overloaded-strings,Haskell,Language Extension,Ghcjs,Overloaded Strings,OverloadedStrings扩展确实非常有用,但它也有一些缺点。 考虑以下函数定义: someFunction :: ToJSSTring a => a -> IO () someFunction = js_function . toJSSTring 在这种情况下,如果我想传递一个文本值,我必须在启用了OverloadedStrings时显式添加一个类型签名: someFunction ("This is plain string" :: String) someFuncti

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
,或者
string
?或者我应该将代码拆分为常规函数(带有
ToJSString
类型约束)和任意函数,它们的参数具有严格的类型签名吗?

您也可以打开
ExtendedDefaultRules


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

您永远不会停止让我惊讶!非常感谢。仅供参考链接已断开
{-# 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"