Copyright | (C) 2008-2013 Edward Kmett, |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell98 |
Documentation
class Bifunctor p where Source
Minimal definition either bimap
or first
and second
Formally, the class Bifunctor
represents a bifunctor
from Hask
-> Hask
.
Intuitively it is a bifunctor where both the first and second arguments are covariant.
You can define a Bifunctor
by either defining bimap
or by defining both
first
and second
.
If you supply bimap
, you should ensure that:
bimap
id
id
≡id
If you supply first
and second
, ensure:
first
id
≡id
second
id
≡id
If you supply both, you should also ensure:
bimap
f g ≡first
f.
second
g
These ensure by parametricity:
bimap
(f.
g) (h.
i) ≡bimap
f h.
bimap
g ifirst
(f.
g) ≡first
f.
first
gsecond
(f.
g) ≡second
f.
second
g
Bifunctor Either | |
Bifunctor (,) | |
Bifunctor Const | |
Bifunctor Arg | |
Bifunctor ((,,) x) | |
Bifunctor (Tagged *) | |
Functor f => Bifunctor (Clown f) | |
Bifunctor p => Bifunctor (Flip p) | |
Functor g => Bifunctor (Joker g) | |
Bifunctor p => Bifunctor (WrappedBifunctor p) | |
Bifunctor ((,,,) x y) | |
(Bifunctor f, Bifunctor g) => Bifunctor (Product f g) | |
(Functor f, Bifunctor p) => Bifunctor (Tannen f p) | |
Bifunctor ((,,,,) x y z) | |
(Bifunctor p, Functor f, Functor g) => Bifunctor (Biff p f g) |