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
)的这个例子礼貌这里 。