Spec-Zone.ru › Haskell 8

Data.Coerce

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

Содержание

  • Безопасные приведения типов

Описание

Безопасные приведения типов.

Более подробную информацию можно найти на странице вики Роли

С версии: base-4.7.0.0

Безопасные приведения типов

coerce :: forall (k :: RuntimeRep) (a :: TYPE k) (b :: TYPE k). Coercible a b => a -> b Источник

Функция coerce позволяет безопасно преобразовывать значения между типами, которые имеют одинаковое представление без накладных расходов во время выполнения. В простейшем случае ее можно использовать вместо конструктора newtype, чтобы перейти от конкретного типа newtype к абстрактному типу. Но она также работает и в более сложных ситуациях, например, при преобразовании списка newtype в список конкретных типов.

Эта функция полиморфна по представлению во время выполнения, но параметр типа RuntimeRep помечен как Inferred, что означает, что он недоступен для видимого применения типа. Это означает, что система типов примет coerce @Int @Age 42.

class a ~R# b => Coercible (a :: k) (b :: k) Источник

Coercible — это двухпараметрический класс, у которого есть экземпляры для типов a и b, если компилятор может определить, что они имеют одинаковое представление. Этот класс не имеет обычных экземпляров; вместо этого они создаются динамически во время проверки типов. Попытка вручную объявить экземпляр Coercible — ошибка.

Тем не менее, можно представить, что существуют следующие три вида экземпляров. Во-первых, как тривиальный базовый случай:

instance Coercible 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

Дополнительную информацию об этой функции можно найти в статье Безопасные приведения типов Иоахима Брайтнера, Ричарда Эйнзберга, Саймона Пейтон Джонса и Стефани Вайрич.

С версии: ghc-prim-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/8.10.2/docs/html/libraries/base-4.14.1.0/Data-Coerce.html

Spec-Zone.ru

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