License | BSD-style |
---|---|
Maintainer | Vincent Hanquez <vincent@snarc.org> |
Stability | experimental |
Portability | portable |
Safe Haskell | Safe-Inferred |
Language | Haskell2010 |
A bifunctor is a type constructor that takes
two type arguments and is a functor in
both
arguments. That
is, unlike with
Functor
, a type constructor such as
Either
does not need to be partially applied for a
Bifunctor
instance, and the methods in this class permit mapping
functions over the
Left
value or the
Right
value,
or both at the same time.
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
.
Documentation
class Bifunctor (p :: Type -> Type -> Type ) where Source #
A bifunctor is a type constructor that takes
two type arguments and is a functor in
both
arguments. That
is, unlike with
Functor
, a type constructor such as
Either
does not need to be partially applied for a
Bifunctor
instance, and the methods in this class permit mapping
functions over the
Left
value or the
Right
value,
or both at the same time.
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
Since: base-4.8.0.0
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d Source #
Map over both arguments at the same time.
bimap
f g ≡first
f.
second
g
Examples
>>>
bimap toUpper (+1) ('j', 3)
('J',4)
>>>
bimap toUpper (+1) (Left 'j')
Left 'J'
>>>
bimap toUpper (+1) (Right 3)
Right 4
Instances
Bifunctor Either |
Since: base-4.8.0.0 |
Bifunctor (,) |
Since: base-4.8.0.0 |
Bifunctor Arg |
Since: base-4.9.0.0 |
Bifunctor These Source # | |
Bifunctor ( (,,) x1) |
Since: base-4.8.0.0 |
Bifunctor ( Const :: Type -> Type -> Type ) |
Since: base-4.8.0.0 |
Bifunctor ( K1 i :: Type -> Type -> Type ) |
Since: base-4.9.0.0 |
Bifunctor ( (,,,) x1 x2) |
Since: base-4.8.0.0 |
Bifunctor ( (,,,,) x1 x2 x3) |
Since: base-4.8.0.0 |
Bifunctor ( (,,,,,) x1 x2 x3 x4) |
Since: base-4.8.0.0 |
Bifunctor ( (,,,,,,) x1 x2 x3 x4 x5) |
Since: base-4.8.0.0 |