Copyright | (C) 2011-2014 Edward Kmett 2018 Ryan Scott |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | GHC |
Safe Haskell | None |
Language | Haskell98 |
Leibnizian equality à la Data.Eq.Type, generalized to be heterogenous using higher-rank kinds.
This module is only exposed on GHC 8.2 and later.
- newtype (a :: j) :== (b :: k) = HRefl {}
- refl :: a :== a
- trans :: (a :== b) -> (b :== c) -> a :== c
- symm :: (a :== b) -> b :== a
- coerce :: (a :== b) -> a -> b
- lift :: (a :== b) -> f a :== f b
- lift2 :: (a :== b) -> f a c :== f b c
- lift2' :: (a :== b) -> (c :== d) -> f a c :== f b d
- lift3 :: (a :== b) -> f a c d :== f b c d
- lift3' :: (a :== b) -> (c :== d) -> (e :== f) -> g a c e :== g b d f
- lower :: forall (j :: Type) (k :: Type) (f :: j -> k) (a :: j) (b :: j). (f a :== f b) -> a :== b
- lower2 :: forall (i :: Type) (j :: Type) (k :: Type) (f :: i -> j -> k) (a :: i) (b :: i) (c :: j). (f a c :== f b c) -> a :== b
- lower3 :: forall (h :: Type) (i :: Type) (j :: Type) (k :: Type) (f :: h -> i -> j -> k) (a :: h) (b :: h) (c :: i) (d :: j). (f a c d :== f b c d) -> a :== b
- toHomogeneous :: (a :== b) -> a := b
- fromHomogeneous :: (a := b) -> a :== b
- fromLeibniz :: forall a b. (a :== b) -> a :~: b
- toLeibniz :: (a :~: b) -> a :== b
- heteroFromLeibniz :: (a :== b) -> a :~~: b
- heteroToLeibniz :: (a :~~: b) -> a :== b
- reprLeibniz :: (a :== b) -> Coercion a b
Heterogeneous Leibnizian equality
newtype (a :: j) :== (b :: k) infixl 4 Source #
Heterogeneous Leibnizian equality.
Leibnizian equality states that two things are equal if you can substitute one for the other in all contexts.
Equality as an equivalence relation
Lifting equality
Lowering equality
lower :: forall (j :: Type) (k :: Type) (f :: j -> k) (a :: j) (b :: j). (f a :== f b) -> a :== b Source #
Type constructors are injective, so you can lower equality through any type constructor.
lower2 :: forall (i :: Type) (j :: Type) (k :: Type) (f :: i -> j -> k) (a :: i) (b :: i) (c :: j). (f a c :== f b c) -> a :== b Source #
lower3 :: forall (h :: Type) (i :: Type) (j :: Type) (k :: Type) (f :: h -> i -> j -> k) (a :: h) (b :: h) (c :: i) (d :: j). (f a c d :== f b c d) -> a :== b Source #
:=
equivalence
:=
is equivalent in power
toHomogeneous :: (a :== b) -> a := b Source #
Convert an appropriately kinded heterogeneous Leibnizian equality into a homogeneous Leibnizian equality '(ET.:=)'.
fromHomogeneous :: (a := b) -> a :== b Source #
Convert a homogeneous Leibnizian equality '(ET.:=)' to an appropriately kinded heterogeneous Leibizian equality.
:~:
equivalence
:~:
is equivalent in power
fromLeibniz :: forall a b. (a :== b) -> a :~: b Source #
:~~:
equivalence
:~~:
is equivalent in power
heteroFromLeibniz :: (a :== b) -> a :~~: b Source #
heteroToLeibniz :: (a :~~: b) -> a :== b Source #
Coercion
conversion
Leibnizian equality can be converted to representational equality
reprLeibniz :: (a :== b) -> Coercion a b Source #