
On Mon, 4 Feb 2008, Felipe Lessa wrote:
Hi there,
Reading http://www.haskell.org/haskellwiki/Things_to_avoid I found an interesting saying:
"By the way, in the case of IO monad the Functor class method fmap and the Monad based function liftM are the same."
I always tought that
prop :: (Functor m, Monad m, Eq (m b)) => (a -> b) -> m a -> Bool prop f x = fmap f x == liftM f x
was True regardless of 'm'. Is there any exception? If so, why? I've even done s/fmap/liftM/g and s/liftM/fmap/g in the past for consistency =).
Problem is that from the idea Functor is a superclass of Monad, with the property that "fmap == liftM". The first relation could have been expressed in Haskell 98 but was not done (forgotten?) in the standard libraries. The second relation can even not be expressed in Haskell 98. So it's only cosmetic, if you use 'liftM' instead of 'fmap' in order to avoid an explicit 'Functor' constraint in a function.