-
OverloadedStrings -
- Since:
-
6.8.1
Включить перегруженные строковые литералы (например, строковые литералы, десугаренные с помощью класса
IsString).
GHC поддерживает перегруженные строковые литералы. Обычно строковый литерал имеет тип String, но при включённых перегруженных строковых литералах (с помощью OverloadedStrings) строковый литерал имеет тип (IsString a) => a.
Это означает, что обычный синтаксис строк может использоваться, например, для ByteString, Text, и других вариантов типов строк. Строковые литералы ведут себя очень похоже на целочисленные литералы, то есть могут использоваться как в выражениях, так и в шаблонах. При использовании в шаблоне литерал будет заменён тестом на равенство, так же как и целочисленный литерал.
Класс IsString определён как:
class IsString a where
fromString :: String -> a
Единственный предопределённый экземпляр — очевидный, чтобы строки работали как обычно:
instance IsString [Char] where
fromString cs = cs
Класс IsString по умолчанию не входит в область видимости. Если вам нужно явно его упомянуть (например, для объявления экземпляра), вы можете импортировать его из модуля Data.String.
Механизм по умолчанию Haskell (Haskell Report, Раздел 4.3.4) расширяется для охвата строковых литералов, когда указан OverloadedStrings. В частности:
- Каждый тип в объявлении
defaultдолжен быть экземпляромNumилиIsString. - Если объявление
defaultне задано, то это как если бы в модуле было объявлениеdefault( Integer, Double, String). - Стандартное правило по умолчанию расширено следующим образом: по умолчанию применяется, когда все неразрешенные ограничения относятся к стандартным классам или
IsString; и по крайней мере один — это числовой класс илиIsString.
Например, выражение length "foo" приведёт к неоднозначному использованию IsString a0 , которое, в силу вышеуказанных правил, будет по умолчанию равно String.
Небольшой пример:
module Main where
import Data.String( IsString(..) )
newtype MyString = MyString String deriving (Eq, Show)
instance IsString MyString where
fromString = MyString
greet :: MyString -> MyString
greet "hello" = "world"
greet other = other
main = do
print $ greet "hello"
print $ greet "fool"
Обратите внимание, что вывод Eq необходим для работы с сопоставлением с образцом, так как оно преобразуется в сравнение на равенство.