Copyright | (C) 2008-2014 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | [email protected] |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell2010 |
Since: base-4.8.0.0
class Bifunctor p 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 i first (f . g) ≡ first f . first g second (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
>>> bimap toUpper (+1) ('j', 3) ('J',4)
>>> bimap toUpper (+1) (Left 'j') Left 'J'
>>> bimap toUpper (+1) (Right 3) Right 4
first :: (a -> b) -> p a c -> p b c Source
Map covariantly over the first argument.
first f ≡ bimap f id
>>> first toUpper ('j', 3) ('J',3)
>>> first toUpper (Left 'j') Left 'J'
second :: (b -> c) -> p a b -> p a c Source
Map covariantly over the second argument.
second ≡ bimap id
>>> second (+1) ('j', 3) ('j',4)
>>> second (+1) (Right 3) Right 4
Bifunctor Either | Since: base-4.8.0.0 |
Bifunctor (,) | Since: base-4.8.0.0 |
Bifunctor Arg | Since: base-4.9.0.0 |
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 |
Defined in Data.Bifunctor |
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.8.3/docs/html/libraries/base-4.13.0.0/Data-Bifunctor.html