# Data.Bifunctor

#### Description

Since: 4.8.0.0

class Bifunctor p where Source

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: 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`

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

Map covariantly over the first argument.

``first` f ≡ `bimap` f `id``

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

Map covariantly over the second argument.

``second` ≡ `bimap` `id``

#### Instances

 Bifunctor Either Bifunctor (,) Bifunctor Const Bifunctor ((,,) x1) Bifunctor ((,,,) x1 x2) Bifunctor ((,,,,) x1 x2 x3) Bifunctor ((,,,,,) x1 x2 x3 x4) Bifunctor ((,,,,,,) x1 x2 x3 x4 x5)

© The University of Glasgow and others