Portability | rank 2 types |
---|---|
Stability | provisional |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Safe Haskell | Safe-Infered |
- class Category k => Isomorphic k where
- isomorphic :: (a -> b) -> (b -> a) -> k a b
- isomap :: ((a -> b) -> c -> d) -> ((b -> a) -> d -> c) -> k a b -> k c d
- data Isomorphism a b = Isomorphism (a -> b) (b -> a)
- from :: Isomorphic k => Isomorphism a b -> k b a
- via :: Isomorphic k => Isomorphism a b -> k a b
- type :~> a b = forall k. Isomorphic k => k a b
Documentation
class Category k => Isomorphic k whereSource
Used to provide overloading of isomorphism application
This is a Category
with a canonical mapping to it from the
category of isomorphisms over Haskell types.
isomorphic :: (a -> b) -> (b -> a) -> k a bSource
Build this morphism out of an isomorphism
The intention is that by using isomorphic
, you can supply both halves of an
isomorphism, but k can be instantiated to (->), so you can freely use
the resulting isomorphism as a function.
isomap :: ((a -> b) -> c -> d) -> ((b -> a) -> d -> c) -> k a b -> k c dSource
Map a morphism in the target category using an isomorphism between morphisms in Hask.
data Isomorphism a b Source
A concrete data type for isomorphisms.
This lets you place an isomorphism inside a container without using ImpredicativeTypes
.
Isomorphism (a -> b) (b -> a) |
from :: Isomorphic k => Isomorphism a b -> k b aSource
Invert an isomorphism.
Note to compose an isomorphism and receive an isomorphism in turn you'll need to use
Category
from (from l) = l
If you imported 'Control.Category.(.)', then:
from l . from r = from (r . l)
from :: (a :~> b) -> (b :~> a)
via :: Isomorphic k => Isomorphism a b -> k a bSource
via :: Isomorphism a b -> (a :~> b)
type :~> a b = forall k. Isomorphic k => k a bSource
An isomorphism from a to b, overloaded to permit its use directly as a function.
You can use a value of type (a :~ b)
as if it were (a -> b)
or Isomorphism a b
.