lens-1.4.1: Lenses, Folds and Traversals

Portabilityrank 2 types
MaintainerEdward Kmett <ekmett@gmail.com>
Safe HaskellSafe-Infered






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.