Proposal: Add default instances for Functor and Applicative
Antoine Latter
aslatter at gmail.com
Sat Sep 24 09:20:08 CEST 2011
On Sat, Sep 24, 2011 at 1:50 AM, Maciej Marcin Piechotka
<uzytkownik2 at gmail.com> wrote:
> On Fri, 2011-09-23 at 23:46 +0100, Duncan Coutts wrote:
>> On 23 September 2011 21:25, Maciej Marcin Piechotka
>> <uzytkownik2 at gmail.com> wrote:
>> > The problem of backward compatibility have been the main obstacle
>> > against adopting Functor f => (Pointed f =>?) => Applicative f => Monad
>> > f.
>> >
>> > This proposition is to add following default instances[1]:
>>
>> Sorry, I'm confused! The [1] link is about default superclass
>> instances, not default signatures. As I understand it, default
>> superclass instances are not implemented yet.
>>
>
> Ups. You're right.
>
>> I fully support the general aim and default superclass instances look
>> like a very sensible way of addressing the problem. It's just not
>> clear to me how the default signatures you're suggesting here get us
>> closer to the goal.
>>
>> Perhaps you can explain it a bit more. I suspect other people on this
>> list don't quite get it either.
>>
>
>
> From example in link [2]. If we had:
>
>> class Functor f where
>> fmap :: (a -> b) -> f a -> f b
>> default fmap :: Applicative f => (a -> b) -> f a -> f b
>> f `fmap` m = pure f <*> m
>> (<$) :: a -> f b -> f a
>> (<$) = fmap . const
>>
>> class Functor f => Pointed f where
>> point :: a -> f a
>> default point :: Applicative f => a -> f a
>> point = pure
>>
>> class Pointed f => Applicative f where
>> pure :: a -> f a
>> default pure :: Monad f => a -> f a
>> pure = return
>> (<*>) :: f (a -> b) -> f a -> f b
>> default (<*>) :: Monad f => f (a -> b) -> f a -> f b
>> f <*> v = liftM2 ($) f v
>> (*>) :: f a -> f b -> f b
>> (*>) = liftA2 (const id)
>> (<*) :: f a -> f b -> f a
>> (<*) = liftA2 const
>>
>> class Applicative f => Monad f where
>> return :: a -> f a
>> (>>=) :: f a -> (a -> f b) -> f b
>> (>>) :: f a -> f b -> f b
>> m >> k = m >>= const k
>
> Then having:
>
>> data List a = List a (List a) | Empty
>>
>> instance Monad List where
>> return x = List x Empty
>> Empty >>= _ = Empty
>> List v vs >>= f = List (f v) (vs >>= f)
>
> is sufficient to use (in current GHC) to use:
>
> test = Empty <*> List 1 Empty
>
> Hence adding default instances + fixing the hierarchy seems to be
> sufficient to have backward compatibility for instance declaration.
>
More information about the Libraries
mailing list