Proposal: Functor and friends for the wrappers in Data.Monoid

Jake McArthur jake.mcarthur at gmail.com
Tue Feb 24 14:00:31 UTC 2015


+1 do all instances of the proposal. It is so common for me to want to use
some polymorphic function but it not be available to me because it has a
constraint not satisfied by a newtype wrapper around the type I want to use
it with, so I have to write a bunch of boilerplate. I think we should
eliminate such boilerplate aggressively. I even think Applicative and Monad
would be useful. Just because a wrapper doesn't add behavior doesn't mean
we should intentionally make it incompatible with so much code.

On 5:07AM, Sun, Feb 22, 2015 Oleg Grenrus <oleg.grenrus at iki.fi> wrote:

> To clarify the discussion:
>
> Let's add the following instances:
>
> A: Functor, Foldable, Traversable to Sum, Product, Dual, First, and Last
> B: Data to everything in Data.Monoid (except Endo): Sum, Product, Dual,
> First and Last, All, Any, Alt
> C: Applicative, Monad, MonadFix to Sum, Product, Dual, First and Last
> D: Data to Identity
>
> All seem to agree on A and B, C is "not sure", and D is new item.
>
> - Oleg
>
> > On 21 Feb 2015, at 17:34, Oleg Grenrus <oleg.grenrus at iki.fi> wrote:
> >
> > I propose to add Functor, Applicative, Monad, Foldable, and Traversable
> and maybe even MonadFix instances to wrapper newtypes in the Data.Monoid
> module.
> > The same way as in the semigroups package, e.g.
> https://hackage.haskell.org/package/semigroups-0.16.1/
> docs/Data-Semigroup.html#t:Min <https://hackage.haskell.org/
> package/semigroups-0.16.1/docs/Data-Semigroup.html#t:Min>
> >
> > Basically:
> >
> > instance Functor Sum where
> >  fmap f (Sum x) = Sum (f x)
> >
> > instance Foldable Sum where
> >  foldMap f (Sum a) = f a
> >
> > instance Traversable Sum where
> >  traverse f (Sum a) = Sum <$> f a
> >
> > instance Applicative Sum where
> >  pure = Sum
> >  a <* _ = a
> >  _ *> a = a
> >  Sum f <*> Sum x = Sum (f x)
> >
> > instance Monad Sum where
> >  return = Sum
> >  _ >> a = a
> >  Sum a >>= f = f a
> >
> > instance MonadFix Sum where
> >  mfix f = fix (f . getSum)
> > _______________________________________________
> > Libraries mailing list
> > Libraries at haskell.org
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20150224/147c10b5/attachment.html>


More information about the Libraries mailing list