Data.Data
| Авторские права | (c) Университет Глазго, CWI 2001—2004 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Разработчик | libraries@haskell.org |
| Устойчивость | экспериментальная |
| Переносимость | непереносимая (локальное универсальное квантование) |
| Safe Haskell | Надежная |
| Язык | Haskell2010 |
Содержание
Описание
"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]
Это подходит для типов данных, которые экспортируются прозрачно.
Минимальное полное определение
Методы
Аргументы
| :: (forall d b. Data d => c (d -> b) -> d -> c b) | определяет, как складываются непустые конструкторские применения. Она принимает сложенное хвостовое приложение конструктора и его голову, т.е. непосредственный подтерм, и объединяет их каким-либо образом. |
| -> (forall g. g -> c g) | определяет, как складывается пустое конструкторское применение, подобно нейтральному / начальному элементу для складывания списков. |
| -> a | структура, подлежащая складыванию. |
| -> c a | результат, с типом, определенным в терминах |
Операция левоассоциативного складывания для конструкторских приложений.
Тип 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 Источник
Преобразование одного непосредственного подтерма с успехом
Примеры использования
Представления типов данных
Представление типов данных. Пакет представлений конструкторов с именами типа и модуля.
Конструкторы
mkDataType :: Строка -> [Констр] -> ТипДанных Источник
Создаёт алгебраический тип данных
mkIntType :: Строка -> ТипДанных Источник
Создаёт тип Int
mkFloatType :: Строка -> ТипДанных Источник
Создаёт тип Float
mkCharType :: Строка -> ТипДанных Источник
Создаёт тип Char
mkNoRepType :: Строка -> ТипДанных Источник
Создаёт тип без представления для непредставимого типа
Наблюдатели
dataTypeName :: ТипДанных -> Строка Источник
Получает имя конструктора типа, включая модуль
data ПредставлениеДанных Источник
Публичное представление типов данных
dataTypeRep :: ТипДанных -> ПредставлениеТипа Источник
Получает общедоступное представление типа данных
Вспомогательные функции
repConstr :: ТипДанных -> ПредставлениеКонструктора -> Конструктор Источник
Поиск конструктора по его представлению
isAlgType :: ТипДанных -> Булево Источник
Проверка на алгебраический тип
dataTypeConstrs :: ТипДанных -> [Конструктор] Источник
Получение конструкторов алгебраического типа данных
indexConstr :: ТипДанных -> ИндексКонструктора -> Конструктор Источник
Получение конструктора по индексу (только для алгебраических типов данных)
maxConstrIndex :: ТипДанных -> ИндексКонструктора Источник
Получение максимального индекса конструктора алгебраического типа данных
isNorepType :: ТипДанных -> Булево Источник
Проверка на тип без представления
Представления конструкторов данных
data Конструктор Источник
Представление конструкторов. Обратите внимание, что сравнение конструкторов с разными типами может не работать — то есть конструкторы для False и Nothing могут быть равны.
Примеры реализации
| Eq Конструктор | Равенство конструкторов |
| Show Конструктор |
type ИндексКонструктора = Целое Источник
Уникальный индекс для конструкторов типов данных, начиная с 1 в порядке их объявления в тексте программы.
data Ассоциативность Источник
Ассоциативность конструкторов
Примеры реализации
Конструкторы
mkConstr :: ТипДанных -> Строка -> [Строка] -> Ассоциативность -> Конструктор Источник
Создает конструктор
mkIntegralConstr :: (Целочисленный a, Show a) => ТипДанных -> a -> Конструктор Источник
mkRealConstr :: (Вещественный a, Show a) => ТипДанных -> a -> Конструктор Источник
mkCharConstr :: ТипДанных -> Символ -> Конструктор Источник
Создаёт конструктор для Char.
Наблюдатели
constrType :: Конструктор -> ТипДанных Источник
Получает тип данных конструктора
data ПредставлениеКонструктора Источник
Общедоступное представление конструкторов
Конструкторы
| AlgConstr ИндексКонструктора | |
| IntConstr Целое | |
| FloatConstr Рациональное | |
| CharConstr Символ |
Примеры реализации
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