Copyright | (C) 2011-2015 Edward Kmett |
---|---|
License | BSD-style (see the file LICENSE) |
Maintainer | Edward Kmett <ekmett@gmail.com> |
Stability | provisional |
Portability | portable |
Safe Haskell | Safe |
Language | Haskell98 |
- class Bifunctor (p :: * -> * -> *) where
- class Bifunctor p => Biapply p where
- (<<$>>) :: (a -> b) -> a -> b
- (<<..>>) :: Biapply p => p a c -> p (a -> b) (c -> d) -> p b d
- bilift2 :: Biapply w => (a -> b -> c) -> (d -> e -> f) -> w a d -> w b e -> w c f
- bilift3 :: Biapply w => (a -> b -> c -> d) -> (e -> f -> g -> h) -> w a e -> w b f -> w c g -> w d h
Biappliable bifunctors
class Bifunctor (p :: * -> * -> *) where #
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 ifirst
(f.
g) ≡first
f.
first
gsecond
(f.
g) ≡second
f.
second
g
Since: 4.8.0.0
Bifunctor Either | Since: 4.8.0.0 |
Bifunctor (,) | Since: 4.8.0.0 |
Bifunctor Arg | Since: 4.9.0.0 |
Bifunctor ((,,) x1) | Since: 4.8.0.0 |
Bifunctor (Const *) | Since: 4.8.0.0 |
Bifunctor (Tagged *) | |
Bifunctor (Constant *) | |
Bifunctor (K1 * i) | Since: 4.9.0.0 |
Bifunctor ((,,,) x1 x2) | Since: 4.8.0.0 |
Bifunctor ((,,,,) x1 x2 x3) | Since: 4.8.0.0 |
Bifunctor p => Bifunctor (WrappedBifunctor * * p) | |
Functor g => Bifunctor (Joker * * g) | |
Bifunctor p => Bifunctor (Flip * * p) | |
Functor f => Bifunctor (Clown * * f) | |
Bifunctor ((,,,,,) x1 x2 x3 x4) | Since: 4.8.0.0 |
(Bifunctor f, Bifunctor g) => Bifunctor (Product * * f g) | |
Bifunctor ((,,,,,,) x1 x2 x3 x4 x5) | Since: 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 => Biapply p where Source #
(<<.>>) :: p (a -> b) (c -> d) -> p a c -> p b d infixl 4 Source #
Biapply (,) Source # | |
Biapply Arg Source # | |
Semigroup x => Biapply ((,,) x) Source # | |
Biapply (Const *) Source # | |
Biapply (Tagged *) Source # | |
(Semigroup x, Semigroup y) => Biapply ((,,,) x y) Source # | |
(Semigroup x, Semigroup y, Semigroup z) => Biapply ((,,,,) x y z) Source # | |
Biapply p => Biapply (WrappedBifunctor * * p) Source # | |
Apply g => Biapply (Joker * * g) Source # | |
Biapply p => Biapply (Flip * * p) Source # | |
Apply f => Biapply (Clown * * f) Source # | |
(Biapply p, Biapply q) => Biapply (Product * * p q) Source # | |
(Apply f, Biapply p) => Biapply (Tannen * * * f p) Source # | |
(Biapply p, Apply f, Apply g) => Biapply (Biff * * * * p f g) Source # | |