Ger*_*_RU 11 haskell language-extension overloaded-strings ghcjs
OverloadedStrings
扩展非常有用,但它有一些缺点.请考虑以下函数定义:
someFunction :: ToJSSTring a => a -> IO ()
someFunction = js_function . toJSSTring
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果我想传递一个文字值,我必须在OverloadedStrings
启用时显式添加一个类型签名:
someFunction ("This is plain string" :: String)
someFunction ("And this one is Text" :: Data.Text.Text)
Run Code Online (Sandbox Code Playgroud)
这种必要性的原因是非常明显的,我想这OverloadedStrings
是为了简化文字值传递给具有严格类型签名的函数,使开发人员无需在pack
任何Text
需要值的地方编写代码.
问题是,有没有办法,默认所有没有类型签名的字符串文字Text
,或String
?或者我应该将我的代码拆分为一般函数(使用ToJSString
类型约束)和任意函数,它们的参数具有严格的类型签名?
Mic*_*man 27
你也可以打开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"
Run Code Online (Sandbox Code Playgroud)
编辑您可能还想添加default (Text)
到模块的顶部以使用它Text
而不是String
默认使用它.