OverloadedStrings

通常,Haskell 中的字符串文字有一种 String(这是 [Char] 的类型别名)。虽然这对于较小的教育程序来说不是问题,但实际应用程序通常需要更高效的存储,例如 TextByteString

OverloadedStrings 只是将文字的类型改为

"test" :: Data.String.IsString a => a

允许它们直接传递给期望这种类型的函数。许多库为类似字符串的类型实现了这个接口,包括 Data.TextData.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)的这个例子礼貌这里