Proposal: Add the missing instances for Traversable (Either b) and Traversable ((,) b)

Edward Kmett ekmett at gmail.com
Sat Jul 28 02:27:47 CEST 2012


The following instances are missing and have only one sensible definition.
I've been bitten by their lack repeatedly and there is no place outside of
base that they can live without needlessly being orphaned.

I would like to propose adding the following instances to Data.Foldable and
Data.Traversable.

instance Foldable (Either e) where foldMap f (Right m) = f m foldMap _ (Left
_) = mempty instance Traversable (Either e) where traverse _ (Left e) = pure
(Left e) traverse f (Right x) = Right <$> f x instance Foldable ((,) e)
where foldMap f (_,x) = f x instance Traversable ((,) e) where traverse f (e
,x) = (,) e <$> f x

I had thought honestly thought we'd already added them long ago.

Discussion Period: 2 Weeks

-Edward Kmett

On Tue, Jan 3, 2012 at 7:50 PM, Ben Millwood <haskell at benmachine.co.uk>wrote:

> Yeah, I noticed this the other day, and a couple of other instances
> which aren't defined, but could be:
>
> http://hpaste.org/56005
>
> I won't pretend I have much use for the Const instance, but it seems
> like it should be there anyway, just for completeness (I think it's
> possible to define Traversable instances for compositions of functors,
> possibly sums and products as well, so Const could be useful in that
> context). I think the Either one makes sense, though, as a natural
> analogue of the Maybe instance.
>
> On Tue, Jan 3, 2012 at 11:41 PM, Conal Elliott <conal at conal.net> wrote:
> > Thanks much for the answers, Conor. They all make sense to me,
> particularly
> > about the typical information discarding in Foldable.
> >
> > Regards, - Conal
> >
> >
> > On Tue, Jan 3, 2012 at 3:30 PM, Conor McBride <
> conor at strictlypositive.org>
> > wrote:
> >>
> >>
> >> On 3 Jan 2012, at 23:12, Conal Elliott wrote:
> >>
> >>> I wanted a Traversable instance for pairing, so I defined one:
> >>> > instance Traversable ((,) o) where
> >>> >   sequenceA (o,fa) = (o,) <$> fa
> >>
> >>
> >> That looks right. Of course, we should really have a BiTraversable
> >> class of which (,) is an instance.
> >>
> >>
> >>>
> >>> However, Foldable is a superclass of Traversable, so I get an error
> >>> message:
> >>>
> >>>    Could not deduce (Foldable ((,) o)) from the context ()
> >>>      arising from the superclasses of an instance declaration
> >>>
> >>> The best I've thought of is the following:
> >>>
> >>> > instance Foldable ((,) o) where
> >>> >   fold (_,m) = m
> >>
> >>
> >> The best (upto efficiency considerations) is always
> >>
> >>
> >>  instance Foldable ((,) o) where
> >>    foldMap = foldMapDefault
> >>
> >> which amounts to what you chose.
> >>
> >> SHE makes this a default superclass instance.
> >>
> >>
> >>> However, I don't like how it discards information.
> >>
> >>
> >> But these folds always do discard information, discarding the shape
> >> information and accumulating over the contents. For ((,) o), seen as
> >> a functor, the first component is shape information and the second is
> >> the content.
> >>
> >>
> >>> Some questions:
> >>>
> >>> * Why is Foldable a superclass of Traversable?
> >>
> >>
> >> Because the constant-monoid Applicative makes every Traversable
> >> Foldable in a uniform way.
> >>
> >>
> >>> * Is there a good choice of a Foldable instance of ((,) o)?
> >>
> >>
> >> Yes, the one you chose.
> >>
> >>
> >>> * Are there any other problems with the Traversable instance above
> >>> (besides foldability)?
> >>
> >>
> >> Nope. It's the Traversable instance which picks out exactly the
> >> contents that correspond to the elements abstracted by the Functor.
> >>
> >> All the best
> >>
> >> Conor
> >>
> >
> >
> > _______________________________________________
> > Libraries mailing list
> > Libraries at haskell.org
> > http://www.haskell.org/mailman/listinfo/libraries
> >
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://www.haskell.org/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/libraries/attachments/20120727/3bdc9fb1/attachment-0001.htm>


More information about the Libraries mailing list