簡體   English   中英

使用重載字符串

[英]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

問題是,有沒有任何方法可以默認所有沒有類型簽名的字符串文字到TextString 或者我應該將我的代碼拆分為一般函數(使用ToJSString類型約束)和任意函數,它們的參數具有嚴格的類型簽名?

您也可以打開ExtendedDefaultRuleshttps://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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM