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 <voldermort@hotmail.com> wrote:
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.