+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.
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@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@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
_______________________________________________
Libraries mailing list
Libraries@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries