On Dec 11, 2007 1:29 PM, apfelmus <<a href="mailto:apfelmus@quantentunnel.de">apfelmus@quantentunnel.de</a>> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Without the automatic search, this is already possible<br><br> class Functor f where<br> fmap :: (a -> b) -> f a -> f b<br><div class="Ih2E3d"><br> class Functor m => Monad m where<br></div> return :: a -> m a
<br> (>>=) :: m a -> (a -> m b) -> m b<br><br> -- aka liftM<br> fmapDefault :: Monad m => (a -> b) -> m a -> m b<br> fmapDefault f m = m >>= (return . f)<br><br> instance Monad [] where
<br> return x = [x]<br> (>>=) = flip concatMap<br><br> instance Functor [] where<br> fmap = fmapDefault<br><br> fmap is already written for you, the instance declaration is only<br>boilerplate. I first saw this in
Data.Traversable .<br></blockquote><div> <br>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.
<br><br></div></div>-- <br>Dave Menendez <<a href="mailto:dave@zednenem.com">dave@zednenem.com</a>><br><<a href="http://www.eyrie.org/~zednenem/">http://www.eyrie.org/~zednenem/</a>>