Copyright | Conor McBride and Ross Paterson 2005 |
---|---|
License | BSD-style (see the LICENSE file in the distribution) |
Maintainer | libraries@haskell.org |
Stability | experimental |
Portability | portable |
Safe Haskell | Trustworthy |
Language | Haskell2010 |
Data.Traversable
Description
Class of data structures that can be traversed from left to right, performing an action on each element.
See also
- "Applicative Programming with Effects", by Conor McBride and Ross Paterson, Journal of Functional Programming 18:1 (2008) 1-13, online at http://www.soi.city.ac.uk/~ross/papers/Applicative.html.
- "The Essence of the Iterator Pattern", by Jeremy Gibbons and Bruno Oliveira, in Mathematically-Structured Functional Programming, 2006, online at http://web.comlab.ox.ac.uk/oucl/work/jeremy.gibbons/publications/#iterator.
- "An Investigation of the Laws of Traversals", by Mauro Jaskelioff and Ondrej Rypacek, in Mathematically-Structured Functional Programming, 2012, online at http://arxiv.org/pdf/1202.2919.
Synopsis
- class (Functor t, Foldable t) => Traversable t where
- for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b)
- forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
- mapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
- mapAccumR :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c)
- fmapDefault :: forall t a b. Traversable t => (a -> b) -> t a -> t b
- foldMapDefault :: forall t m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m
The Traversable
class
class (Functor t, Foldable t) => Traversable t where Source #
Functors representing data structures that can be traversed from left to right.
A definition of traverse
must satisfy the following laws:
- naturality
t .
for every applicative transformationtraverse
f =traverse
(t . f)t
- identity
traverse
Identity = Identity- composition
traverse
(Compose .fmap
g . f) = Compose .fmap
(traverse
g) .traverse
f
A definition of sequenceA
must satisfy the following laws:
- naturality
t .
for every applicative transformationsequenceA
=sequenceA
.fmap
tt
- identity
sequenceA
.fmap
Identity = Identity- composition
sequenceA
.fmap
Compose = Compose .fmap
sequenceA
.sequenceA
where an applicative transformation is a function
t :: (Applicative f, Applicative g) => f a -> g a
preserving the Applicative
operations, i.e.
and the identity functor Identity
and composition of functors Compose
are defined as
newtype Identity a = Identity a instance Functor Identity where fmap f (Identity x) = Identity (f x) instance Applicative Identity where pure x = Identity x 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 x = Compose (pure (pure x)) Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)
(The naturality law is implied by parametricity.)
Instances are similar to Functor
, e.g. given a data type
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
a suitable instance would be
instance Traversable Tree where traverse f Empty = pure Empty traverse f (Leaf x) = Leaf <$> f x traverse f (Node l k r) = Node <$> traverse f l <*> f k <*> traverse f r
This is suitable even for abstract types, as the laws for <*>
imply a form of associativity.
The superclass instances should satisfy the following:
- In the
Functor
instance,fmap
should be equivalent to traversal with the identity applicative functor (fmapDefault
). - In the
Foldable
instance,foldMap
should be equivalent to traversal with a constant applicative functor (foldMapDefault
).
Methods
traverse :: Applicative f => (a -> f b) -> t a -> f (t b) Source #
Map each element of a structure to an action, evaluate these actions
from left to right, and collect the results. For a version that ignores
the results see traverse_
.
sequenceA :: Applicative f => t (f a) -> f (t a) Source #
Evaluate each action in the structure from left to right, and
and collect the results. For a version that ignores the results
see sequenceA_
.
mapM :: Monad m => (a -> m b) -> t a -> m (t b) Source #
Map each element of a structure to a monadic action, evaluate
these actions from left to right, and collect the results. For
a version that ignores the results see mapM_
.
sequence :: Monad m => t (m a) -> m (t a) Source #
Evaluate each monadic action in the structure from left to
right, and collect the results. For a version that ignores the
results see sequence_
.
Instances
Methods
traverse :: Applicative f => (a -> f b) -> URec * Char a -> f (URec * Char b) Source #
sequenceA :: Applicative f => URec * Char (f a) -> f (URec * Char a) Source #
mapM :: Monad m => (a -> m b) -> URec * Char a -> m (URec * Char b) Source #
sequence :: Monad m => URec * Char (m a) -> m (URec * Char a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> URec * Double a -> f (URec * Double b) Source #
sequenceA :: Applicative f => URec * Double (f a) -> f (URec * Double a) Source #
mapM :: Monad m => (a -> m b) -> URec * Double a -> m (URec * Double b) Source #
sequence :: Monad m => URec * Double (m a) -> m (URec * Double a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> URec * Float a -> f (URec * Float b) Source #
sequenceA :: Applicative f => URec * Float (f a) -> f (URec * Float a) Source #
mapM :: Monad m => (a -> m b) -> URec * Float a -> m (URec * Float b) Source #
sequence :: Monad m => URec * Float (m a) -> m (URec * Float a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> URec * Int a -> f (URec * Int b) Source #
sequenceA :: Applicative f => URec * Int (f a) -> f (URec * Int a) Source #
mapM :: Monad m => (a -> m b) -> URec * Int a -> m (URec * Int b) Source #
sequence :: Monad m => URec * Int (m a) -> m (URec * Int a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> URec * Word a -> f (URec * Word b) Source #
sequenceA :: Applicative f => URec * Word (f a) -> f (URec * Word a) Source #
mapM :: Monad m => (a -> m b) -> URec * Word a -> m (URec * Word b) Source #
sequence :: Monad m => URec * Word (m a) -> m (URec * Word a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> URec * (Ptr ()) a -> f (URec * (Ptr ()) b) Source #
sequenceA :: Applicative f => URec * (Ptr ()) (f a) -> f (URec * (Ptr ()) a) Source #
mapM :: Monad m => (a -> m b) -> URec * (Ptr ()) a -> m (URec * (Ptr ()) b) Source #
sequence :: Monad m => URec * (Ptr ()) (m a) -> m (URec * (Ptr ()) a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> Const * m a -> f (Const * m b) Source #
sequenceA :: Applicative f => Const * m (f a) -> f (Const * m a) Source #
mapM :: Monad m => (a -> m b) -> Const * m a -> m (Const * m b) Source #
sequence :: Monad m => Const * m (m a) -> m (Const * m a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> (* :+: f) g a -> f ((* :+: f) g b) Source #
sequenceA :: Applicative f => (* :+: f) g (f a) -> f ((* :+: f) g a) Source #
mapM :: Monad m => (a -> m b) -> (* :+: f) g a -> m ((* :+: f) g b) Source #
sequence :: Monad m => (* :+: f) g (m a) -> m ((* :+: f) g a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> (* :*: f) g a -> f ((* :*: f) g b) Source #
sequenceA :: Applicative f => (* :*: f) g (f a) -> f ((* :*: f) g a) Source #
mapM :: Monad m => (a -> m b) -> (* :*: f) g a -> m ((* :*: f) g b) Source #
sequence :: Monad m => (* :*: f) g (m a) -> m ((* :*: f) g a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> Sum * f g a -> f (Sum * f g b) Source #
sequenceA :: Applicative f => Sum * f g (f a) -> f (Sum * f g a) Source #
mapM :: Monad m => (a -> m b) -> Sum * f g a -> m (Sum * f g b) Source #
sequence :: Monad m => Sum * f g (m a) -> m (Sum * f g a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> Product * f g a -> f (Product * f g b) Source #
sequenceA :: Applicative f => Product * f g (f a) -> f (Product * f g a) Source #
mapM :: Monad m => (a -> m b) -> Product * f g a -> m (Product * f g b) Source #
sequence :: Monad m => Product * f g (m a) -> m (Product * f g a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> M1 * i c f a -> f (M1 * i c f b) Source #
sequenceA :: Applicative f => M1 * i c f (f a) -> f (M1 * i c f a) Source #
mapM :: Monad m => (a -> m b) -> M1 * i c f a -> m (M1 * i c f b) Source #
sequence :: Monad m => M1 * i c f (m a) -> m (M1 * i c f a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> (* :.: *) f g a -> f ((* :.: *) f g b) Source #
sequenceA :: Applicative f => (* :.: *) f g (f a) -> f ((* :.: *) f g a) Source #
mapM :: Monad m => (a -> m b) -> (* :.: *) f g a -> m ((* :.: *) f g b) Source #
sequence :: Monad m => (* :.: *) f g (m a) -> m ((* :.: *) f g a) Source #
Methods
traverse :: Applicative f => (a -> f b) -> Compose * * f g a -> f (Compose * * f g b) Source #
sequenceA :: Applicative f => Compose * * f g (f a) -> f (Compose * * f g a) Source #
mapM :: Monad m => (a -> m b) -> Compose * * f g a -> m (Compose * * f g b) Source #
sequence :: Monad m => Compose * * f g (m a) -> m (Compose * * f g a) Source #
Utility functions
for :: (Traversable t, Applicative f) => t a -> (a -> f b) -> f (t b) Source #
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b) Source #
mapAccumL :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) Source #
mapAccumR :: Traversable t => (a -> b -> (a, c)) -> a -> t b -> (a, t c) Source #
General definitions for superclass methods
fmapDefault :: forall t a b. Traversable t => (a -> b) -> t a -> t b Source #
This function may be used as a value for fmap
in a Functor
instance, provided that traverse
is defined. (Using
fmapDefault
with a Traversable
instance defined only by
sequenceA
will result in infinite recursion.)
fmapDefault
f ≡runIdentity
.traverse
(Identity
. f)
foldMapDefault :: forall t m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m Source #