Spec-Zone.ru › Haskell 9

Data.Coerce

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

Содержание

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

Описание

Безопасные преобразования между типами данных.

Более подробная информация доступна на странице вики Страница вики по ролям

С момента выпуска: base-4.7.0.0

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

coerce :: Coercible a b => a -> b Источник

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

При использовании в преобразованиях, включающих обёртку newtype, убедитесь, что конструктор newtype находится в области видимости.

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

Примеры

Развернуть
>>> newtype TTL = TTL Int deriving (Eq, Ord, Show)
>>> newtype Age = Age Int deriving (Eq, Ord, Show)
>>> coerce (Age 42) :: TTL
TTL 42
>>> coerce (+ (1 :: Int)) (Age 42) :: TTL
TTL 43
>>> coerce (map (+ (1 :: Int))) [Age 42, Age 24] :: [TTL]
[TTL 43,TTL 25]

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

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

С момента выпуска: ghc-prim-0.4.0

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

Spec-Zone.ru

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