My guess is that nobody has put forward a clear enough design that solves
all the problems. In particular, orphan instances are tricky.
Here's an example:
module Prelude where
class (Functor m, Applicative m) => Monad m where
return :: a -> m a
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
a >> b = a >>= const b
pure = return
(<*>) = ap
fmap = liftM
module X where
data X a = ...
module Y where
instance Functor X where fmap = ...
module Z where
instance Monad X where
return = ...
(>>=) = ...
-- default implementation of fmap brought in from Monad definition
module Main where
import X
import Z
foo :: X Int
foo = ...
bar :: X Int
bar = fmap (+1) foo -- which implementation of fmap is used? The one from
Y?
-- ryan
On Sun, Jul 24, 2011 at 8:55 PM, Ivan Lazar Miljenovic <
[email protected]> wrote:
> On 25 July 2011 13:50, Sebastien Zany <[email protected]>
> wrote:
> > I was thinking the reverse. We can already give default implementations
> of class operations that can be overridden by giving them explicitly when we
> declare instances, so why shouldn't we be able to give default
> implementations of operations of more general classes, which could be
> overridden by a separate instance declaration for these?
> >
> > Then I could say something like "a monad is also automatically a functor
> with fmap by default given by..." and if I wanted to give a more efficient
> fmap for a particular monad I would just instantiate it as a functor
> explicitly.
>
> I believe this has been proposed before, but a major problem is that
> you cannot do such overriding.
>
> --
> Ivan Lazar Miljenovic
> [email protected]
> IvanMiljenovic.wordpress.com
>
> _______________________________________________
> Haskell-Cafe mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/haskell-cafe
>
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe