On Tue, Jan 4, 2011 at 1:21 PM, Conor McBride
<co...@strictlypositive.org> wrote:
> Jón's proposal was to improve the latter situation by allowing the subclass
> to specify a default (partial) implementation of a superclass. So we might
> write
>
>  class Applicative f where
>    return :: x -> f x
>    (<*>) :: f (s -> t) -> f s -> f t
>    instance Functor f where
>      fmap = pure . (<*>)
>
> giving not only a subclass constraint (Functor f =>) but also a standard
> means to satisfy it. Whenever an Applicative instance is declared, its
> Functor sub-instance is unpacked: buy one, get one free.
>
> This, on its own, is not quite enough. For one thing, we need a way to
> switch it off. I should certainly be permitted to write something like
>
>  instance Applicative Blah where
>    return = ...
>    (<*>) = ...
>    hiding instance Functor Blah

The use of 'hiding' here I'd object to, as it really isn't a good
description of what's going on. Personally I'd think it more clear to
explicitly opt into an automatic instance:
instance Applicative Blah where
  return = ...
  (<*>) = ...
  deriving (Functor) -- or something like that

but one of the advantages of John Meachem's original proposal was that
it allowed for example a library author to split up a class without
users changing their instances, which my idea would not do. I suppose
that alone makes it far less useful, but I think there is an argument
to be made about how much of this process we want to be explicit and
how much we want to be implicit.

_______________________________________________
Haskell-prime mailing list
Haskell-prime@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-prime

Reply via email to