Subject: Re: Re[2]: All Monads are Functors Newsgroups: gmane.comp.lang.haskell.prime Date: Monday 14th August 2006 09:49:58 UTC (over 11 years ago) On 2006-08-14 at 12:03+0400 Bulat Ziganshin wrote: > Hello Taral, > > Monday, August 14, 2006, 9:02:58 AM, you wrote: > > > In my opinion, an instance definition of a subclass should allow the > > superclass's methods to be defined as if they were part of the > > subclass, e.g.: > > > instance Monad [] where > > fmap = map > > return x = [x] > > join = concat > > i support this idea. [...] I'm not sure it's quite right. Surely it only makes sense if it defines all the (necessary) superclass methods -- in other words, what you are doing is defining an instance, just omitting the "instance Functor []" line, which doesn't seem like a great advantage. If we are going to play around with this stuff, here's another suggestion that solves my original problem more neatly: In a class declaration, a superclass context is a requirement that instances of the class have instances of the superclass; this is similar to the type declarations of the methods. We could have had class Monad m where instance Functor m (>>=):: ... instead of class Functor m => Monad m where (>>=):: ... of course, there's no reason to do that, but what I'm proposing is that we allow default instance declarations in class declarations in much the same way as default methods: > class Functor m => Monad m where > (>>=):: ... > return:: ... > join:: ... > instance Functor m where > fmap f = (>>= return . f) This shouldn't be hard to implement: all the compiler has to do when reading an instance declaration for Monad is to generate an instance declaration for Functor, substituting the espression for m that comes from the instance declaration for Monad. I don't know whether there's anything to be gained by adding the option of overriding the default inside an instance declaration: > instance Monad [] where > return x = [x] > join = concat > instance Functor [] where > fmap = map but clearly a top-level instance declaration would override the default anyway. -- Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk |
|||