字串
文字的型別
沒有任何擴充套件,字串文字的型別 - 即雙引號之間的東西 - 只是一個字串,也就是字元列表:
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
語言擴充套件的更多資訊,請參閱擴充套件文件 。