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"