| 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
- traverse :: Applicative f => (a -> f b) -> t a -> f (t b)
- sequenceA :: Applicative f => t (f a) -> f (t a)
- mapM :: Monad m => (a -> m b) -> t a -> m (t b)
- sequence :: Monad m => t (m a) -> m (t a)
- 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 transformationtraversef =traverse(t . f)t- Identity
traverseIdentity=Identity- Composition
traverse(Compose.fmapg . f) =Compose.fmap(traverseg) .traversef
A definition of sequenceA must satisfy the following laws:
- Naturality
t .for every applicative transformationsequenceA=sequenceA.fmaptt- Identity
sequenceA.fmapIdentity=Identity- Composition
sequenceA.fmapCompose=Compose.fmapsequenceA.sequenceA
where an applicative transformation is a function
t :: (Applicative f, Applicative g) => f a -> g a
preserving the Applicative operations, i.e.
t (purex) =purex t (f<*>x) = t f<*>t x
and the identity functor Identity and composition functors
Compose are from Data.Functor.Identity and
Data.Functor.Compose.
(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
Functorinstance,fmapshould be equivalent to traversal with the identity applicative functor (fmapDefault). - In the
Foldableinstance,foldMapshould 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
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
| Traversable [] Source # | Since: 2.1 |
| Traversable Maybe Source # | Since: 2.1 |
| Traversable Par1 Source # | Since: 4.9.0.0 |
| Traversable NonEmpty Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| Traversable Down Source # | Since: 4.12.0.0 |
| Traversable Product Source # | Since: 4.8.0.0 |
Defined in Data.Traversable | |
| Traversable Sum Source # | Since: 4.8.0.0 |
| Traversable Dual Source # | Since: 4.8.0.0 |
| Traversable Last Source # | Since: 4.8.0.0 |
| Traversable First Source # | Since: 4.8.0.0 |
| Traversable Identity Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| Traversable ZipList Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| Traversable Option Source # | Since: 4.9.0.0 |
Defined in Data.Semigroup | |
| Traversable Last Source # | Since: 4.9.0.0 |
| Traversable First Source # | Since: 4.9.0.0 |
| Traversable Max Source # | Since: 4.9.0.0 |
| Traversable Min Source # | Since: 4.9.0.0 |
| Traversable Complex Source # | Since: 4.9.0.0 |
Defined in Data.Complex | |
| Traversable (Either a) Source # | Since: 4.7.0.0 |
Defined in Data.Traversable Methods traverse :: Applicative f => (a0 -> f b) -> Either a a0 -> f (Either a b) Source # sequenceA :: Applicative f => Either a (f a0) -> f (Either a a0) Source # mapM :: Monad m => (a0 -> m b) -> Either a a0 -> m (Either a b) Source # sequence :: Monad m => Either a (m a0) -> m (Either a a0) Source # | |
| Traversable (V1 :: Type -> Type) Source # | Since: 4.9.0.0 |
| Traversable (U1 :: Type -> Type) Source # | Since: 4.9.0.0 |
| Traversable ((,) a) Source # | Since: 4.7.0.0 |
| Ix i => Traversable (Array i) Source # | Since: 2.1 |
Defined in Data.Traversable | |
| Traversable (Proxy :: Type -> Type) Source # | Since: 4.7.0.0 |
| Traversable (Arg a) Source # | Since: 4.9.0.0 |
Defined in Data.Semigroup | |
| Traversable f => Traversable (Rec1 f) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| Traversable (URec Char :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable 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 # | |
| Traversable (URec Double :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable 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 # | |
| Traversable (URec Float :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable 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 # | |
| Traversable (URec Int :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| Traversable (URec Word :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable 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 # | |
| Traversable (URec (Ptr ()) :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable 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 # | |
| Traversable f => Traversable (Alt f) Source # | Since: 4.12.0.0 |
Defined in Data.Traversable | |
| Traversable f => Traversable (Ap f) Source # | Since: 4.12.0.0 |
| Traversable (Const m :: Type -> Type) Source # | Since: 4.7.0.0 |
Defined in Data.Traversable | |
| Traversable (K1 i c :: Type -> Type) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| (Traversable f, Traversable g) => Traversable (f :+: g) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable Methods traverse :: Applicative f0 => (a -> f0 b) -> (f :+: g) a -> f0 ((f :+: g) b) Source # sequenceA :: Applicative f0 => (f :+: g) (f0 a) -> f0 ((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 # | |
| (Traversable f, Traversable g) => Traversable (f :*: g) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable Methods traverse :: Applicative f0 => (a -> f0 b) -> (f :*: g) a -> f0 ((f :*: g) b) Source # sequenceA :: Applicative f0 => (f :*: g) (f0 a) -> f0 ((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 # | |
| (Traversable f, Traversable g) => Traversable (Sum f g) Source # | Since: 4.9.0.0 |
Defined in Data.Functor.Sum | |
| (Traversable f, Traversable g) => Traversable (Product f g) Source # | Since: 4.9.0.0 |
Defined in Data.Functor.Product Methods traverse :: Applicative f0 => (a -> f0 b) -> Product f g a -> f0 (Product f g b) Source # sequenceA :: Applicative f0 => Product f g (f0 a) -> f0 (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 # | |
| Traversable f => Traversable (M1 i c f) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable | |
| (Traversable f, Traversable g) => Traversable (f :.: g) Source # | Since: 4.9.0.0 |
Defined in Data.Traversable Methods traverse :: Applicative f0 => (a -> f0 b) -> (f :.: g) a -> f0 ((f :.: g) b) Source # sequenceA :: Applicative f0 => (f :.: g) (f0 a) -> f0 ((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 # | |
| (Traversable f, Traversable g) => Traversable (Compose f g) Source # | Since: 4.9.0.0 |
Defined in Data.Functor.Compose Methods traverse :: Applicative f0 => (a -> f0 b) -> Compose f g a -> f0 (Compose f g b) Source # sequenceA :: Applicative f0 => Compose f g (f0 a) -> f0 (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.)
fmapDefaultf ≡runIdentity.traverse(Identity. f)
foldMapDefault :: forall t m a. (Traversable t, Monoid m) => (a -> m) -> t a -> m Source #