Data.Coerce
| Авторские права | (c) Университет Глазго 2001 |
|---|---|
| Лицензия | BSD-стиль (см. файл libraries/base/LICENSE) |
| Поддержка | libraries@haskell.org |
| Стабильность | предварительная |
| Переносимость | переносимый |
| Безопасный Haskell | Небезопасный |
| Язык | Haskell2010 |
Содержание
Описание
Безопасные преобразования между типами данных.
Более подробную информацию можно найти на странице wiki Ролей
С тех пор: 4.7.0.0
Безопасные преобразования типов
coerce :: Coercible * a b => a -> b Исходный код
Функция coerce позволяет безопасно преобразовывать значения типов, которые имеют одинаковое представление без накладных расходов во время выполнения. В простейшем случае её можно использовать вместо конструктора newtype, чтобы перейти от конкретного типа newtype к абстрактному типу. Но она также работает в более сложных сценариях, например, при преобразовании списка newtype в список конкретных типов.
class Coercible a b Исходный код
Этот класс с двумя параметрами имеет экземпляры для типов a и b, если компилятор может вывести, что они имеют одинаковое представление. Этот класс не имеет обычных экземпляров; вместо этого они создаются во время проверки типов. Попытка вручную объявить экземпляр Coercible является ошибкой.
Тем не менее, можно предположить, что существуют следующие три вида экземпляров. Во-первых, как тривиальный базовый случай:
instance a a
Кроме того, для каждого конструктора типа существует экземпляр, который позволяет выполнить преобразование под конструктором типа. Например, пусть D — это прототипический конструктор типа (data или newtype) с тремя аргументами типа, которые имеют роли nominal, representational и phantom соответственно. Тогда существует экземпляр следующего вида
instance Coercible b b' => Coercible (D a b c) (D a b' c')
Обратите внимание, что аргументы типа nominal равны, аргументы типа representational могут отличаться, но должны иметь экземпляр Coercible, и аргументы типа phantom могут быть изменены произвольно.
Третий вид экземпляра существует для каждого newtype NT = MkNT T и представлен в двух вариантах:
instance Coercible a T => Coercible a NT
instance Coercible T b => Coercible NT b
Этот экземпляр можно использовать только в том случае, если конструктор MkNT находится в области видимости.
Если, как автор библиотеки конструктора типа, например, Set a, вы хотите предотвратить использование пользователем вашего модуля coerce :: Set T -> Set NT, вам необходимо установить роль параметра типа Set на nominal, написав
type role Set nominal
Для получения более подробной информации об этой функции, пожалуйста, обратитесь к Безопасным преобразованиям типов Джоахима Брейтнера, Ричарда Э. Айзенберга, Саймона Пейтона Джонса и Стефани Вейрих.
С тех пор: 4.7.0.0
© 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-Coerce.html