OverloadedStrings
通常,Haskell 中的字串文字有一種 String(這是 [Char] 的型別別名)。雖然這對於較小的教育程式來說不是問題,但實際應用程式通常需要更高效的儲存,例如 Text 或 ByteString。
OverloadedStrings 只是將文字的型別改為
"test" :: Data.String.IsString a => a
允許它們直接傳遞給期望這種型別的函式。許多庫為類似字串的型別實現了這個介面,包括 Data.Text 和 Data.ByteString ,它們都比 [Char]提供了一定的時間和空間優勢。
OverloadedStrings 也有一些獨特的用法,比如 Postgresql-simple 庫中的那些,它允許用雙引號編寫 SQL 查詢,就像普通字串一樣,但提供了對不正確連線的保護,這是一種臭名昭著的 SQL 注入攻擊源。
要建立 IsString 類的例項,你需要實現 fromString 功能。示例 † :
data Foo = A | B | Other String deriving Show
instance IsString Foo where
fromString "A" = A
fromString "B" = B
fromString xs = Other xs
tests :: [ Foo ]
tests = [ "A", "B", "Testing" ]
† 發現林登 Maydwell(GitHub 上 sordina)的這個例子禮貌這裡 。