Hi Ben

On 4 Jan 2011, at 19:19, Ben Millwood wrote:

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

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.

It's perhaps suboptimal. I chose "hiding" only because it's already
a vaguely keywordy thing. It's only syntax. What's important is...

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 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.

...the argument about what should be implicit or explicit, opt-in
or opt-out. In this argument, I disagree with you.

I'd much rather it was notationally cheaper to go with the supplied
default, provided deviation from the default is also fairly cheap
(but explicit).

My plan also has the advantage of cheaper backward compatibility
(for this and other (future) class splittings).

Note that in my example, return had moved to Applicative, pure had
been dumped, and a typical Monad instance would look like

instance Monad Maybe where
  Just x >>= f = f x
  Nothing >>= _ = Nothing
  return = Just   -- where this implicitly opts into and extends the
                  -- Applicative instance
                  -- and also implicitly generates Functor

We could not simply have said "deriving Applicative" here, because
the default instance is incomplete. In general, one might want to
override some but not all of the default instance, just as one
does when default method implementations come from the class.

There's a general engineering concern as well. The refactoring cost
of splitting Applicative off as a lesser version of Monad, taking
return, adding (<*>) derivable from (>>=) is much reduced by this
choice. I'm sure it's not the only instance of a class we might
discover is better split: the opt-in default reduces inertia to
such design improvements.

I'd certainly be happy with a different opt-out notation, but I
would be unhappy if opting in (and overriding/extending) were
made more complex than necessary to allow an opt-out default.

All the best

Conor


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

Reply via email to