Data.Bifunctor
| 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 |
Description
Since: base-4.8.0.0
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 i first (f . g) ≡ first f . first g second (f . g) ≡ second f . second g
Since: base-4.8.0.0
Methods
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
first :: (a -> b) -> p a c -> p b c Source
Map covariantly over the first argument.
first f ≡ bimap f id
Examples
>>> 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
Examples
>>> second (+1) ('j', 3)
('j',4)
>>> second (+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 >>> first id (undefined :: (Int, Word)) `seq` () () >>> second id (undefined :: (Int, Word)) `seq` () () >>> id (errorWithoutStackTrace "error!" :: (Int, Word)) `seq` () *** Exception: error! 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 |
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/9.12.1/docs/libraries/base-4.21.0.0-8e62/Data-Bifunctor.html