| Safe Haskell | Safe |
|---|---|
| Language | Haskell2010 |
Bifunctor
Bifunctor
class Bifunctor (p :: * -> * -> *) where #
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:
bimapidid≡id
If you supply first and second, ensure:
firstid≡idsecondid≡id
If you supply both, you should also ensure:
bimapf g ≡firstf.secondg
These ensure by parametricity:
bimap(f.g) (h.i) ≡bimapf h.bimapg ifirst(f.g) ≡firstf.firstgsecond(f.g) ≡secondf.secondg
Since: base-4.8.0.0
Methods
bimap :: (a -> b) -> (c -> d) -> p a c -> p b d #
Map over both arguments at the same time.
bimapf g ≡firstf.secondg
Examples
>>>bimap toUpper (+1) ('j', 3)('J',4)
>>>bimap toUpper (+1) (Left 'j')Left 'J'
>>>bimap toUpper (+1) (Right 3)Right 4
Instances
| Bifunctor Either | Since: base-4.8.0.0 |
| Bifunctor (,) | Since: base-4.8.0.0 |
| Bifunctor Arg | Since: base-4.9.0.0 |
| Bifunctor Gr | |
| Bifunctor Entry | |
| Bifunctor ((,,) x1) | Since: base-4.8.0.0 |
| Bifunctor (Const :: * -> * -> *) | Since: base-4.8.0.0 |
| Functor f => Bifunctor (FreeF f) | |
| Functor f => Bifunctor (CofreeF f) | |
| Bifunctor (Tagged :: * -> * -> *) | |
| Bifunctor (K1 i :: * -> * -> *) | 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 p => Bifunctor (WrappedBifunctor p) | |
Defined in Data.Bifunctor.Wrapped Methods bimap :: (a -> b) -> (c -> d) -> WrappedBifunctor p a c -> WrappedBifunctor p b d # first :: (a -> b) -> WrappedBifunctor p a c -> WrappedBifunctor p b c # second :: (b -> c) -> WrappedBifunctor p a b -> WrappedBifunctor p a c # | |
| Functor g => Bifunctor (Joker g :: * -> * -> *) | |
| Bifunctor p => Bifunctor (Flip p) | |
| Functor f => Bifunctor (Clown f :: * -> * -> *) | |
| Bifunctor ((,,,,,) x1 x2 x3 x4) | Since: base-4.8.0.0 |
| (Bifunctor p, Bifunctor q) => Bifunctor (Sum p q) | |
| (Bifunctor f, Bifunctor g) => Bifunctor (Product f g) | |
| Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) | Since: base-4.8.0.0 |
| (Functor f, Bifunctor p) => Bifunctor (Tannen f p) | |
| (Bifunctor p, Functor f, Functor g) => Bifunctor (Biff p f g) | |
class Bifunctor p => Swapped (p :: * -> * -> *) where #
This class provides for symmetric bifunctors.
Minimal complete definition
Methods
swapped :: (Profunctor p, Functor f) => p (p b a) (f (p d c)) -> p (p a b) (f (p c d)) #
Instances
| Swapped Either | |
Defined in Control.Lens.Iso | |
| Swapped (,) | |
Defined in Control.Lens.Iso Methods swapped :: (Profunctor p, Functor f) => p (b, a) (f (d, c)) -> p (a, b) (f (c, d)) # | |
Biapply
class Bifunctor p => Biapply (p :: * -> * -> *) where #
Minimal complete definition
Methods
(<<.>>) :: p (a -> b) (c -> d) -> p a c -> p b d infixl 4 #
Instances
| Biapply (,) | |
| Biapply Arg | |
| Semigroup x => Biapply ((,,) x) | |
| Biapply (Const :: * -> * -> *) | |
| Biapply (Tagged :: * -> * -> *) | |
| (Semigroup x, Semigroup y) => Biapply ((,,,) x y) | |
| (Semigroup x, Semigroup y, Semigroup z) => Biapply ((,,,,) x y z) | |
| Biapply p => Biapply (WrappedBifunctor p) | |
Defined in Data.Functor.Bind.Class Methods (<<.>>) :: WrappedBifunctor p (a -> b) (c -> d) -> WrappedBifunctor p a c -> WrappedBifunctor p b d # (.>>) :: WrappedBifunctor p a b -> WrappedBifunctor p c d -> WrappedBifunctor p c d # (<<.) :: WrappedBifunctor p a b -> WrappedBifunctor p c d -> WrappedBifunctor p a b # | |
| Apply g => Biapply (Joker g :: * -> * -> *) | |
| Biapply p => Biapply (Flip p) | |
| Apply f => Biapply (Clown f :: * -> * -> *) | |
| (Biapply p, Biapply q) => Biapply (Product p q) | |
| (Apply f, Biapply p) => Biapply (Tannen f p) | |
| (Biapply p, Apply f, Apply g) => Biapply (Biff p f g) | |