Functors representing data structures that can be traversed from left
to right.
A definition of
traverse must satisfy the following laws:
A definition of
sequenceA must satisfy the following laws:
where an
applicative transformation is a function
t :: (Applicative f, Applicative g) => f a -> g a
preserving the
Applicative operations, i.e.
t (pure x) = pure x
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.
A result of the naturality law is a purity law for
traverse
traverse pure = pure
(The naturality law is implied by parametricity and thus so is the
purity law [1, p15].)
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:
References: [1] The Essence of the Iterator Pattern, Jeremy Gibbons
and Bruno C. d. S. Oliveira