[英]Using 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
旨在簡化文字值傳遞給具有嚴格類型簽名的函數,使開發人員無需在需要Text
值的地方編寫pack
。
問題是,有沒有任何方法可以默認所有沒有類型簽名的字符串文字到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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.