On Dec 11, 2007 1:29 PM, apfelmus <[EMAIL PROTECTED]> wrote: > Without the automatic search, this is already possible > > class Functor f where > fmap :: (a -> b) -> f a -> f b > > class Functor m => Monad m where > return :: a -> m a > (>>=) :: m a -> (a -> m b) -> m b > > -- aka liftM > fmapDefault :: Monad m => (a -> b) -> m a -> m b > fmapDefault f m = m >>= (return . f) > > instance Monad [] where > return x = [x] > (>>=) = flip concatMap > > instance Functor [] where > fmap = fmapDefault > > fmap is already written for you, the instance declaration is only > boilerplate. I first saw this in Data.Traversable . >
This is pretty much how I define Functor and Applicative instances for my monads. It is admittedly irritating to have to write out the boilerplate, but it doesn't seem irritating enough to require a language extension to eliminate. -- Dave Menendez <[EMAIL PROTECTED]> <http://www.eyrie.org/~zednenem/>
_______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe