
Am Dienstag, 15. August 2006 23:34 schrieb Jon Fairbairn:
On 2006-08-15 at 16:25CDT Taral wrote:
On 8/15/06, Bulat Ziganshin
wrote: in this case we lose "class Functor a => Monad a" base class declaration. so what will be the meaning of this:
I don't see why that is the case.
class Functor m => Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b instance Functor m where fmap f = (>>= return . f)
What's wrong with this? All Monads are Functors. If you don't provide a Functor, it gets defined for you. The problem is working out whether to use the default Functor or an external Functor.
It seems obvious to me that we always use an external definition if one exists, so I suppose the problem is knowing whether an external instance exists -- so this proposal would rely on doing something about scoping for instances, I suppose.
I see a solution in different ways of writitng an instance: [code] -- to define the functions in the Functor, using the defaults defined in the class _Functor_ (assumed there would be any default): instance Monad m where return = ... (>>=) = ... instance Functor m where -- to define the functions in the Functor, using the defaults defined in the class _Monad_: instance Monad m where return = ... (>>=) = ... instance Functor m where --to define a new Functor: instance Monad m where return = ... (>>=) = ... instance Functor m where fmap = ... --or instance Monad m where return = ... (>>=) = ... instance Functor m where fmap = ... [/code] the advantages are, that we can decide which default functions we want to use, and that it will be compatible to the old library. - marc