
2 Oct
2008
2 Oct
'08
7:48 p.m.
If your datatype with a Monad instance also has a Functor instance (which it *can* have, you just need to declare the instance), then liftM is equivalent to fmap.
Only if you ignore efficiency issues, of course. Some monads have an fmap which is significantly faster than bind. liftM f m = do a <- m return (f a) Consider []; this becomes liftM f m = m >>= \a -> return (f a) = concatMap (\a -> [f a]) m which, in the absence of other optimizations, is going to do a lot more allocation and branching than fmap fmap f m = map f m -- ryan