Spec-Zone.ru › Haskell 7

Data.Data

Авторские права (c) Университет Глазго, CWI 2001—2004
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Разработчик libraries@haskell.org
Устойчивость экспериментальная
Переносимость непереносимая (локальное универсальное квантование)
Safe Haskell Надежная
Язык Haskell2010

Содержание

  • Модуль Data.Typeable повторно экспортирован для удобства
  • Класс Data для обработки приложений конструкторов
  • Представления типов данных
    • Конструкторы
    • Наблюдатели
    • Функции для удобства
  • Представления конструкторов данных
    • Конструкторы
    • Наблюдатели
    • Функция для удобства: алгебраические типы данных
    • От строк к конструкторам и обратно: все типы данных
  • Функции для удобства: разборка конструкторов типов
  • Определенные в терминах gunfold обобщенные операции

Описание

"Scrap your boilerplate" --- Обобщённое программирование на Haskell. См. http://www.haskell.org/haskellwiki/Research_papers/Generics#Scrap_your_boilerplate.21. Этот модуль предоставляет класс Data со своими примитивами для обобщённого программирования, вместе с экземплярами для многих типов данных. Он соответствует слиянию предыдущего Data.Generics.Basics и почти всех Data.Generics.Instances. Экземпляры, отсутствующие в этом модуле, были перемещены в модуль Data.Generics.Instances в пакете syb.

Для получения дополнительной информации посетите новый вики-сайт SYB: http://www.cs.uu.nl/wiki/bin/view/GenericProgramming/SYB.

Модуль Data.Typeable повторно экспортирован для удобства

module Data.Typeable

Класс Data для обработки приложений конструкторов

class Typeable a => Data a where Источник

Класс Data включает фундаментальный примитив gfoldl для сворачивания приложений конструкторов, скажем, терминов. Этот примитив может быть инстанцирован различными способами для отображения по непосредственным подтерминам термина; см. комбинаторы gmap в этом классе позже. Действительно, обобщённому программисту не обязательно использовать изобретательный примитив gfoldl, а скорее интуитивные комбинаторы gmap. Примитив gfoldl дополняется средствами запроса конструкторов верхнего уровня, преобразования представлений конструкторов в корректные термины и перечисления всех возможных конструкторов типов данных. Это дополнение позволяет нам обслуживать сценарии обобщённого программирования, такие как чтение, вывод, равенство, генерация терминов.

Комбинаторы gmapT, gmapQ, gmapM, и т. д. предоставляются с определениями по умолчанию в терминах gfoldl, оставляя возможность предоставления определений, специфичных для типа данных. (Включение комбинаторов gmap в качестве членов класса Data позволяет программисту или компилятору выводить специализированный, возможно, более эффективный код для каждого типа данных. Примечание: gfoldl является более высокоуровневым, чем комбинаторы gmap. Это предмет текущих экспериментов по бенчмаркингу. Возможно, комбинаторы gmap будут перемещены из класса Data.)

Понятийно, определение комбинаторов gmap в терминах примитива gfoldl требует идентификации аргументов функции gfoldl. Технически, нам также необходимо определить конструктор типа c для построения типа результата из типа сложенного термина.

В определении комбинаторов gmapQx, мы используем конструкторы типов-фантомов для c в типе gfoldl, потому что тип результата запроса не включает (полиморфный) тип аргумента термина. В определении gmapQl мы просто используем обычный константный конструктор типа, потому что gfoldl является левоассоциативным, поэтому он легко пригоден для сворачивания левоассоциативной бинарной операции над непосредственными подтерминами. В определении gmapQr требуется дополнительная работа. Мы используем трюк накопления высшего порядка, чтобы согласовать левоассоциативное применение конструкторов с правоассоциативной бинарной операцией (например, (:)). Когда запрос предназначен для вычисления значения типа r, тогда тип результата в обобщенном сворачивании равен r -> r. Таким образом, результатом сворачивания является функция, которой мы, наконец, передаём правый единичный элемент.

С опцией -XDeriveDataTypeable, GHC может автоматически генерировать экземпляры класса Data. Например, с объявлением

data T a b = C1 a b | C2 deriving (Typeable, Data)

GHC сгенерирует экземпляр, эквивалентный

instance (Data a, Data b) => Data (T a b) where
    gfoldl k z (C1 a b) = z C1 `k` a `k` b
    gfoldl k z C2       = z C2

    gunfold k z c = case constrIndex c of
                        1 -> k (k (z C1))
                        2 -> z C2

    toConstr (C1 _ _) = con_C1
    toConstr C2       = con_C2

    dataTypeOf _ = ty_T

con_C1 = mkConstr ty_T "C1" [] Prefix
con_C2 = mkConstr ty_T "C2" [] Prefix
ty_T   = mkDataType "Module.T" [con_C1, con_C2]

Это подходит для типов данных, которые экспортируются прозрачно.

Минимальное полное определение

gunfold, toConstr, dataTypeOf

Методы

gfoldl Источник

Аргументы

:: (forall d b. Data d => c (d -> b) -> d -> c b)

определяет, как складываются непустые конструкторские применения. Она принимает сложенное хвостовое приложение конструктора и его голову, т.е. непосредственный подтерм, и объединяет их каким-либо образом.

-> (forall g. g -> c g)

определяет, как складывается пустое конструкторское применение, подобно нейтральному / начальному элементу для складывания списков.

-> a

структура, подлежащая складыванию.

-> c a

результат, с типом, определенным в терминах a, но вариативность достигается с помощью конструктора типов c для построения фактического типа результата.

Операция левоассоциативного складывания для конструкторских приложений.

Тип gfoldl является проблематичным, но операционно это простое обобщение складывания списка.

Значение по умолчанию для gfoldl равно const id, что подходит для абстрактных типов данных без подструктур.

gunfold :: (forall b r. Data b => c (b -> r) -> c r) -> (forall r. r -> c r) -> Constr -> c a Источник

Разворачивание конструкторских приложений

toConstr :: a -> Constr Источник

Получение конструктора из данного значения. Для правильных терминов это предполагается верхним конструктором. Примитивные типы данных здесь рассматриваются как потенциально бесконечные множества значений (т.е. конструкторов).

dataTypeOf :: a -> DataType Источник

Внешний конструктор типов

dataCast1 :: Typeable t => (forall d. Data d => c (t d)) -> Maybe (c a) Источник

Промежуточные типы и унарные конструкторы типов. В Data случаях формы T a, dataCast1 должно быть определено как gcast1.

Значение по умолчанию — const Nothing, что подходит для неунарных конструкторов типов.

dataCast2 :: Typeable t => (forall d e. (Data d, Data e) => c (t d e)) -> Maybe (c a) Источник

Промежуточные типы и бинарные конструкторы типов. В Data случаях формы T a b, dataCast2 должно быть определено как gcast2.

Значение по умолчанию — const Nothing, что подходит для небинарных конструкторов типов.

gmapT :: (forall b. Data b => b -> b) -> a -> a Источник

Общее преобразование, которое отображает непосредственные подтермы

Значение по умолчанию подставляет конструктор типа c в типе gfoldl в конструктор идентичности типа данных, используя пару изоморфизма в качестве инъекции и проекции.

gmapQl :: forall r r'. (r -> r' -> r) -> r -> (forall d. Data d => d -> r') -> a -> r Источник

Общий запрос с левоассоциативным бинарным оператором

gmapQr :: forall r r'. (r' -> r -> r) -> r -> (forall d. Data d => d -> r') -> a -> r Источник

Общий запрос с правоассоциативным бинарным оператором

gmapQ :: (forall d. Data d => d -> u) -> a -> [u] Источник

Общий запрос, который обрабатывает непосредственные подтермы и возвращает список результатов. Список предоставляется в том же порядке, что и первоначально указано в объявлении конструкторов данных.

gmapQi :: forall u. Int -> (forall d. Data d => d -> u) -> a -> u Источник

Общий запрос, который обрабатывает одного потомка по индексу (нумерация с нуля)

gmapM :: forall m. Monad m => (forall d. Data d => d -> m d) -> a -> m a Источник

Общее монадическое преобразование, которое отображает непосредственные подтермы

Значение по умолчанию подставляет конструктор типа c в типе gfoldl в конструктор типа монады, определяя инъекцию и проекцию с использованием return и >>=.

gmapMp :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a Источник

Преобразование по крайней мере одного непосредственного подтерма не вызывает ошибки

gmapMo :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a Источник

Преобразование одного непосредственного подтерма с успехом

Примеры использования

Data Bool
Data Char
Data Double
Data Float
Data Int
Data Int8
Data Int16
Data Int32
Data Int64
Data Integer
Data Ordering
Data Word
Data Word8
Data Word16
Data Word32
Data Word64
Data ()
Data Version
Data Natural
Data SpecConstrAnnotation
Data Void
Data a => Data [a]
(Data a, Integral a) => Data (Ratio a)
(Data a, Typeable * a) => Data (Ptr a)
Data a => Data (Maybe a)
(Data a, Typeable * a) => Data (ForeignPtr a)
Data a => Data (Complex a)
Typeable * a => Data (Fixed a)
Data a => Data (Identity a)
(Data a, Data b) => Data (Either a b)
(Data a, Data b) => Data (a, b)
Data t => Data (Proxy * t)
(Data a, Data b, Data c) => Data (a, b, c)
((~) * a b, Data a) => Data ((:~:) * a b)
(Coercible * a b, Data a, Data b) => Data (Coercion * a b)
(Data a, Data b, Data c, Data d) => Data (a, b, c, d)
(Data a, Data b, Data c, Data d, Data e) => Data (a, b, c, d, e)
(Data a, Data b, Data c, Data d, Data e, Data f) => Data (a, b, c, d, e, f)
(Data a, Data b, Data c, Data d, Data e, Data f, Data g) => Data (a, b, c, d, e, f, g)

Представления типов данных

data ТипДанных Источник

Представление типов данных. Пакет представлений конструкторов с именами типа и модуля.

Примеры использования

Вывод ТипДанных

Конструкторы

mkDataType :: Строка -> [Констр] -> ТипДанных Источник

Создаёт алгебраический тип данных

mkIntType :: Строка -> ТипДанных Источник

Создаёт тип Int

mkFloatType :: Строка -> ТипДанных Источник

Создаёт тип Float

mkCharType :: Строка -> ТипДанных Источник

Создаёт тип Char

mkNoRepType :: Строка -> ТипДанных Источник

Создаёт тип без представления для непредставимого типа

Наблюдатели

dataTypeName :: ТипДанных -> Строка Источник

Получает имя конструктора типа, включая модуль

data ПредставлениеДанных Источник

Публичное представление типов данных

Конструкторы

AlgRep [Констр]
IntRep
FloatRep
CharRep
NoRep

Примеры реализации

Eq DataRep
Show DataRep

dataTypeRep :: ТипДанных -> ПредставлениеТипа Источник

Получает общедоступное представление типа данных

Вспомогательные функции

repConstr :: ТипДанных -> ПредставлениеКонструктора -> Конструктор Источник

Поиск конструктора по его представлению

isAlgType :: ТипДанных -> Булево Источник

Проверка на алгебраический тип

dataTypeConstrs :: ТипДанных -> [Конструктор] Источник

Получение конструкторов алгебраического типа данных

indexConstr :: ТипДанных -> ИндексКонструктора -> Конструктор Источник

Получение конструктора по индексу (только для алгебраических типов данных)

maxConstrIndex :: ТипДанных -> ИндексКонструктора Источник

Получение максимального индекса конструктора алгебраического типа данных

isNorepType :: ТипДанных -> Булево Источник

Проверка на тип без представления

Представления конструкторов данных

data Конструктор Источник

Представление конструкторов. Обратите внимание, что сравнение конструкторов с разными типами может не работать — то есть конструкторы для False и Nothing могут быть равны.

Примеры реализации

Eq Конструктор

Равенство конструкторов

Show Конструктор

type ИндексКонструктора = Целое Источник

Уникальный индекс для конструкторов типов данных, начиная с 1 в порядке их объявления в тексте программы.

data Ассоциативность Источник

Ассоциативность конструкторов

Конструкторы

Префикс
Инфикс

Примеры реализации

Eq Ассоциативность
Show Ассоциативность

Конструкторы

mkConstr :: ТипДанных -> Строка -> [Строка] -> Ассоциативность -> Конструктор Источник

Создает конструктор

mkIntegralConstr :: (Целочисленный a, Show a) => ТипДанных -> a -> Конструктор Источник

mkRealConstr :: (Вещественный a, Show a) => ТипДанных -> a -> Конструктор Источник

mkCharConstr :: ТипДанных -> Символ -> Конструктор Источник

Создаёт конструктор для Char.

Наблюдатели

constrType :: Конструктор -> ТипДанных Источник

Получает тип данных конструктора

data ПредставлениеКонструктора Источник

Общедоступное представление конструкторов

Конструкторы

AlgConstr ИндексКонструктора
IntConstr Целое
FloatConstr Рациональное
CharConstr Символ

Примеры реализации

Eq ПредставлениеКонструктора
Show ПредставлениеКонструктора

constrRep :: Конструктор -> ПредставлениеКонструктора Источник

Получает общедоступное представление конструкторов

constrFields :: Конструктор -> [Строка] Источник

Получает метки полей конструктора. Список меток возвращается в том же порядке, в котором они были заданы в исходном объявлении конструктора.

constrFixity :: Конструктор -> Ассоциативность Источник

Получает ассоциативность конструктора

Вспомогательная функция: алгебраические типы данных

constrIndex :: Конструктор -> ИндексКонструктора Источник

Получение индекса конструктора (только для алгебраических типов данных)

Из строк в конструкторы и обратно: все типы данных

showConstr :: Конструктор -> Строка Источник

Получение строки для конструктора

readConstr :: ТипДанных -> Строка -> Возможно Конструктор Источник

Поиск конструктора по строке

Вспомогательные функции: разбор конструкторов типов

tyconUQname :: Строка -> Строка Источник

Получение неквалифицированного конструктора типа: удаление *.*.*... перед именем

tyconModule :: String -> String Source

Получает модуль конструктора типа: взять *.*.*... перед именем

Обобщенные операции, определённые с помощью gunfold

fromConstr :: Data a => Constr -> a Source

Построить скелет термина

fromConstrB :: Data a => (forall d. Data d => d) -> Constr -> a Source

Построить термин и использовать обобщённую функцию для подтерминов

fromConstrM :: forall m a. (Monad m, Data a) => (forall d. Data d => m d) -> Constr -> m a Source

Монадная вариация на fromConstrB

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/7.10.3/docs/html/libraries/base-4.8.2.0/Data-Data.html

Spec-Zone.ru

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