
Hi Jonathon,
Traversable instances do not change the shape of a data structure!
On the contrary, the whole purpose of traverse is to combine effectful
computations, stored in a structure without changing its shape! While
Foldable folds over the contents of a data structure (via Monoid),
Traversable allows you to fold over the effects attached to the contents of
that structure (via Applicative).
It turns out that by using Const applicative functor you can use traverse
to perform foldMap! Thus every Traversable is trivially a Foldable (see
foldMapDefault).
Similarly, every Traversable is trivially a Functor if you use Identity
applicative functor (see fmapDefault).
This is why Traversable has those Functor and Foldable constraints, not
because it relies on fmap or foldMap.
Kind regards,
Nick
On Thu, 4 May 2017 at 10:49 Jonathon Delgado
It seems that Traversable is doing two things:
1) Changing the shape of a data structure. 2) Folding over the contents of a data structure.
Traversable requires Foldable to enable 2, but Traversable is also applied to types such as (,) where only 1 is relevant.
If this is correct, follow-up questions would be:
1) For educational purposes, could these concerns be split without substantial drawback? 2) For practical purposes, could this be done without breaking a lot of existing code? _______________________________________________ Haskell-Cafe mailing list To (un)subscribe, modify options or view archives go to: http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe Only members subscribed via the mailman list are allowed to post.