bifunctors-4.1.0.1: Bifunctors

Portability | portable
Stability | provisional
Maintainer | Edward Kmett <ekmett@gmail.com>
Safe Haskell | Safe-Inferred

Data.Bifunctor

Description

Synopsis

- class Bifunctor p where
  - bimap :: (a -> b) -> (c -> d) -> p a c -> p b d
  - first :: (a -> b) -> p a c -> p b c
  - second :: (b -> c) -> p a b -> p a c

# 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 i
     first  (f . g) ≡ first  f . first  g
     second (f . g) ≡ second f . second g

Methods

bimap :: (a -> b) -> (c -> d) -> p a c -> p b dSource

Map over both arguments at the same time.

    bimap f g ≡ first f . second g

first :: (a -> b) -> p a c -> p b cSource

Map covariantly over the first argument.

    first f ≡ bimap f id

second :: (b -> c) -> p a b -> p a cSource

Map covariantly over the second argument.

    second ≡ bimap id

Instances

Bifunctor Either |
Bifunctor (,) |
Bifunctor Const |
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) |
Bifunctor ((,,,,) x y z) |