没有任何扩展名,字符串文字的类型(即,双引号之间的内容)只是一个字符串,又称字符列表:
Prelude> :t "foo" "foo" :: [Char]
但是,OverloadedStrings启用扩展名后,字符串文字变得多态,类似于数字文字:
Prelude> :set -XOverloadedStrings Prelude> :t "foo" "foo" :: Data.String.IsString t => t
这使我们可以定义类似字符串的类型的值,而无需任何显式转换。本质上,OverloadedStrings扩展名只是将每个字符串文字包装在通用fromString转换函数中,因此,如果上下文需要例如更有效的Text而不是String,则您不必自己担心。
{-# LANGUAGE OverloadedStrings #-} importData.Text(Text, pack) importData.ByteString(ByteString, pack) withString :: String withString = "Hello String" -- The following two examples are only allowed with OverloadedStrings withText :: Text withText = "Hello Text" -- instead of: withText = Data.Text.pack "Hello Text" withBS :: ByteString withBS = "Hello ByteString" -- instead of: withBS = Data.ByteString.pack "Hello ByteString"
注意,我们如何能够构造值,Text并ByteString以与构造普通String(或[Char])值相同的方式,而不是使用每种类型的pack函数来显式编码字符串。
有关OverloadedStrings语言扩展的更多信息,请参见扩展文档。