Spec-Zone.ru › Haskell 9

6.9.7. Перегруженные строковые литералы

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 необходим для работы с сопоставлением с образцом, так как оно преобразуется в сравнение на равенство.

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.12.1/docs/users_guide/exts/overloaded_strings.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API