Copyright | (C) 2008-2014 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | libraries@haskell.org |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Since: base-4.8.0.0
Documentation
class (forall a. Functor (p a)) => 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.
The class definition of a Bifunctor
p
uses the
QuantifiedConstraints
language extension to quantify over the first type
argument a
in its context. The context requires that p a
must be a Functor
for all a
. In other words a partially
applied Bifunctor
must be a Functor
. This makes Functor
a
superclass of Bifunctor
such that a function with a
Bifunctor
constraint may use fmap
in its implementation.
Functor
has been a quantified superclass of
Bifunctor
since base-4.18.0.0.
You can define a Bifunctor
by either defining bimap
or by
defining both first
and second
. The second
method must
agree with fmap
:
second
≡fmap
From this it follows that:
second
id
≡id
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 Arg Source # | Since: base-4.9.0.0 |
Bifunctor Either Source # | Since: base-4.8.0.0 |
Bifunctor (,) Source # | Class laws for tuples hold only up to laziness. Both
Since: base-4.8.0.0 |
Bifunctor (Const :: Type -> Type -> Type) Source # | Since: base-4.8.0.0 |
Bifunctor ((,,) x1) Source # | Since: base-4.8.0.0 |
Bifunctor (K1 i :: Type -> Type -> Type) Source # | Since: base-4.9.0.0 |
Bifunctor ((,,,) x1 x2) Source # | Since: base-4.8.0.0 |
Bifunctor ((,,,,) x1 x2 x3) Source # | Since: base-4.8.0.0 |
Bifunctor ((,,,,,) x1 x2 x3 x4) Source # | Since: base-4.8.0.0 |
Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) Source # | Since: base-4.8.0.0 |