Spec-Zone.ru › Haskell 9

Data.Coerce

Авторские права (c) The University of Glasgow 2001
Лицензия в стиле BSD (см. файл libraries/base/LICENSE)
Сопровождающий libraries@haskell.org
Стабильность предварительная
Переносимость переносимая
Безопасный 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

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

Начиная с: ghc-internal-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.14.1/docs/libraries/base-4.22.0.0-66f8/Data-Coerce.html

Spec-Zone.ru

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