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
需要值(value)。问题是有什么方法可以将所有没有类型签名的字符串文字默认为
Text
, 或 String
?或者我应该将我的代码拆分为通用函数(带有 ToJSString
类型约束)和任意函数,它们的参数具有严格的类型签名?
最佳答案
您可以开启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"
编辑 您可能还想添加
default (Text)
到你的模块顶部让它使用Text
而不是 String
默认。
关于haskell - 使用重载字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778415/