Spec-Zone.ru › Haskell 9

6.10.2. Ограничения равенства и ограничение Coercible

6.10.2.1. Ограничения равенства

При включённом TypeOperators контекст типов может содержать ограничения равенства вида t1 ~ t2, которые означают, что типы t1 и t2 должны совпадать. При наличии семейств типов обычно невозможно локально определить, равны ли два типа. Поэтому контексты сигнатур функций могут содержать ограничения равенства, как в следующем примере:

sumCollects :: (Collects c1, Collects c2, Elem c1 ~ Elem c2) => c1 -> c2 -> c2

где мы требуем, чтобы тип элемента c1 и c2 совпадал. В общем случае типы t1 и t2 в ограничении равенства могут быть произвольными мономонотипами; то есть они не могут содержать кванторов независимо от того, включена ли поддержка типов более высокого ранга.

Ограничения равенства также могут встречаться в контекстах классов и экземпляров. Первые позволяют просто преобразовывать программы, использующие функциональные зависимости, в программы, использующие синонимы семейств. Общая идея состоит в том, чтобы переписать объявление класса вида

class C a b | a -> b

в

class (F a ~ b) => C a b where
  type F a

То есть мы представляем каждую функциональную зависимость (FD) a1 .. an -> b семейством типов FD F a1 .. an и равенством в контексте суперклассов F a1 .. an ~ b, по сути присваивая функциональной зависимости имя. В экземплярах классов мы определяем экземпляры типов семейств FD в соответствии с заголовком класса. Этот процесс не затрагивает сигнатуры методов.

6.10.2.2. Разнородное равенство

GHC также поддерживает разнородное по виду равенство, которое связывает два типа, потенциально имеющих разные виды. Разнородное равенство записывается как ~~. Чтобы лучше понять их различие, ниже приведены виды ~ и ~~:

(~)  :: forall k. k -> k -> Constraint
(~~) :: forall k1 k2. k1 -> k2 -> Constraint

Скорее всего, пользователям понадобится ~, однако ~~ доступно, если GHC не может заранее знать, что интересующие типы имеют одинаковый вид. Свидетельство того, что (a :: k1) ~~ (b :: k2), сообщает GHC как о совпадении k1 и k2, так и о совпадении a и b.

Поскольку ~ — более распространённое отношение равенства, GHC выводит ~~ как ~, если не установлен параметр -fprint-equality-relations.

6.10.2.3. Неподнятое разнородное равенство

Внутри GHC существует ещё одно, третье отношение равенства — (~#). Оно разнородное (как ~~) и используется только внутри системы. Оно может появляться в сообщениях об ошибках и других выходных данных только при включённом параметре -fprint-equality-relations.

6.10.2.4. Ограничение Coercible

Ограничение Coercible t1 t2 похоже на t1 ~ t2, но обозначает равенство на уровне представления между t1 и t2 в смысле ролей (Роли). Оно экспортируется модулем Data.Coerce, в котором также содержится документация. Дополнительные сведения и обсуждение приведены в статье «Безопасные приведения».

© 2002–2007 The University Court of the University of Glasgow. All rights reserved.
Licensed under the Glasgow Haskell Compiler License.
https://downloads.haskell.org/~ghc/9.14.1/docs/users_guide/exts/equality_constraints.html

Spec-Zone.ru

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