Jason Dusek wrote:
2009/05/30 Bartosz Wójcik <[email protected]>:
...reading RWH I could not memorize what those liftM funtions
meant.
The basic one, `liftM`, means `fmap`, though specialized for
functors that are monads.
Prelude Control.Monad> :t liftM
liftM :: forall a b (m :: * -> *). (Monad m) => (a -> b) -> m a -> m b
Prelude Control.Monad> :t fmap
fmap :: forall a b (f :: * -> *). (Functor f) => (a -> b) -> f a -> f b
Category theoretically, all the following are (or should be!) equal:
fmap, (<$>), liftA, liftM.
Type theoretically, they differ in whether they require Functor,
Applicative, or Monad. Unfortunately there's a clash between the current
types and their CT backing. That is, Monad doesn't require Applicative
(or Functor), so people will often use liftM to avoid extra type
constraints.
Operationally, fmap and (<$>) are potentially more efficient. The liftA
and liftM functions re-engineer fmap by using pure/(<*>) or return/ap,
thanks to CT. The (<$>) function is just an alias for fmap. But the fmap
function is part of a type class and so it may have a specific
implementation which is more efficient than the generic one provided by CT.
--
Live well,
~wren
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe