字符串
文字的类型
没有任何扩展,字符串文字的类型 - 即双引号之间的东西 - 只是一个字符串,也就是字符列表:
Prelude> :t "foo"
"foo" :: [Char]
但是,当启用 OverloadedStrings
扩展时,字符串文字变为多态,类似于数字文字 :
Prelude> :set -XOverloadedStrings
Prelude> :t "foo"
"foo" :: Data.String.IsString t => t
这允许我们定义类似字符串的类型的值,而无需任何显式转换。本质上,OverloadedStrings
扩展只包含通用 fromString
转换函数中的每个字符串文字,因此如果上下文需要例如更高效的 Text
而不是 String
,则你不需要自己担心。
使用字符串文字
{-# LANGUAGE OverloadedStrings #-}
import Data.Text (Text, pack)
import Data.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
语言扩展的更多信息,请参阅扩展文档 。