| Portability | portable |
|---|---|
| Stability | provisional |
| Maintainer | Edward Kmett <ekmett@gmail.com> |
| Safe Haskell | Safe-Inferred |
Data.Bitraversable
Description
- class (Bifunctor t, Bifoldable t) => Bitraversable t where
- bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)
- bisequenceA :: Applicative f => t (f a) (f b) -> f (t a b)
- bimapM :: Monad m => (a -> m c) -> (b -> m d) -> t a b -> m (t c d)
- bisequence :: Monad m => t (m a) (m b) -> m (t a b)
- bifor :: (Bitraversable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)
- biforM :: (Bitraversable t, Monad m) => t a b -> (a -> m c) -> (b -> m d) -> m (t c d)
- bimapAccumL :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e)
- bimapAccumR :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e)
- bimapDefault :: Bitraversable t => (a -> b) -> (c -> d) -> t a c -> t b d
- bifoldMapDefault :: (Bitraversable t, Monoid m) => (a -> m) -> (b -> m) -> t a b -> m
Documentation
class (Bifunctor t, Bifoldable t) => Bitraversable t whereSource
Minimal complete definition either bitraverse or bisequenceA.
Bitraversable identifies bifunctorial data structures whose elements can
be traversed in order, performing Applicative or Monad actions at each
element, and collecting a result structure with the same shape.
A definition of traverse must satisfy the following laws:
- naturality
-
for every applicative transformationbitraverse(t . f) (t . g) ≡ t .bitraversef gt - identity
-
bitraverseIdentityIdentity≡Identity - composition
-
Compose.fmap(bitraverseg1 g2) .bitraversef1 f2 ≡traverse(Compose.fmapg1 . f1) (Compose.fmapg2 . f2)
A definition of bisequenceA must satisfy the following laws:
- naturality
-
for every applicative transformationbisequenceA.bimapt t ≡ t .bisequenceAt - identity
-
bisequenceA.bimapIdentityIdentity≡Identity - composition
-
bisequenceA.bimapComposeCompose≡Compose.fmapbisequenceA.bisequenceA
where an applicative transformation is a function
t :: (Applicativef,Applicativeg) => f a -> g a
preserving the Applicative operations:
t (purex) =purex t (f<*>x) = t f<*>t x
and the identity functor Identity and composition functors Compose are
defined as
newtype Identity a = Identity { runIdentity :: a }
instance Functor Identity where
fmap f (Identity x) = Identity (f x)
instance Applicative Identity where
pure = Identity
Identity f <*> Identity x = Identity (f x)
newtype Compose f g a = Compose (f (g a))
instance (Functor f, Functor g) => Functor (Compose f g) where
fmap f (Compose x) = Compose (fmap (fmap f) x)
instance (Applicative f, Applicative g) => Applicative (Compose f g) where
pure = Compose . pure . pure
Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)
Some simple examples are Either and '(,)':
instance Bitraversable Either where bitraverse f _ (Left x) = Left <$> f x bitraverse _ g (Right y) = Right <$> g y instance Bitraversable (,) where bitraverse f g (x, y) = (,) <$> f x <*> g y
Bitraversable relates to its superclasses in the following ways:
bimapf g ≡runIdentity.bitraverse(Identity. f) (Identity. g)bifoldMapf g =getConst.bitraverse(Const. f) (Const. g)
These are available as bimapDefault and bifoldMapDefault respectively.
Methods
bitraverse :: Applicative f => (a -> f c) -> (b -> f d) -> t a b -> f (t c d)Source
Evaluates the relevant functions at each element in the structure, running the action, and builds a new structure with the same shape, using the elements produced from sequencing the actions.
bitraversef g ≡bisequenceA.bimapf g
bisequenceA :: Applicative f => t (f a) (f b) -> f (t a b)Source
Sequences all the actions in a structure, building a new structure with the same shape using the results of the actions.
bisequenceA≡bitraverseidid
bimapM :: Monad m => (a -> m c) -> (b -> m d) -> t a b -> m (t c d)Source
As bitraverse, but uses evidence that m is a Monad rather than an
Applicative.
bimapMf g ≡bisequence.bimapf gbimapMf g ≡unwrapMonad.bitraverse(WrapMonad. f) (WrapMonad. g)
bisequence :: Monad m => t (m a) (m b) -> m (t a b)Source
As bisequenceA, but uses evidence that m is a Monad rather than an
Applicative.
bisequence≡bimapMididbisequence≡unwrapMonad.bisequenceA.bimapWrapMonadWrapMonad
Instances
| Bitraversable Either | |
| Bitraversable (,) | |
| Bitraversable Const | |
| Bitraversable ((,,) x) | |
| Bitraversable (Tagged *) | |
| Traversable f => Bitraversable (Clown f) | |
| Bitraversable p => Bitraversable (Flip p) | |
| Traversable g => Bitraversable (Joker g) | |
| Bitraversable p => Bitraversable (WrappedBifunctor p) | |
| Bitraversable ((,,,) x y) | |
| (Bitraversable f, Bitraversable g) => Bitraversable (Product f g) | |
| Bitraversable ((,,,,) x y z) |
bifor :: (Bitraversable t, Applicative f) => t a b -> (a -> f c) -> (b -> f d) -> f (t c d)Source
bifor is bitraverse with the structure as the first argument.
biforM :: (Bitraversable t, Monad m) => t a b -> (a -> m c) -> (b -> m d) -> m (t c d)Source
bimapAccumL :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e)Source
Traverses a structure from left to right, threading a state of type a
and using the given actions to compute new elements for the structure.
bimapAccumR :: Bitraversable t => (a -> b -> (a, c)) -> (a -> d -> (a, e)) -> a -> t b d -> (a, t c e)Source
Traverses a structure from right to left, threading a state of type a
and using the given actions to compute new elements for the structure.
bimapDefault :: Bitraversable t => (a -> b) -> (c -> d) -> t a c -> t b dSource
A default definition of bimap in terms of the Bitraversable operations.
bifoldMapDefault :: (Bitraversable t, Monoid m) => (a -> m) -> (b -> m) -> t a b -> mSource
A default definition of bifoldMap in terms of the Bitraversable operations.