map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
Perché abbiamo tre diverse funzioni che fanno essenzialmente la stessa cosa?
map
e liftM
dovrebbero sicuramente fare esattamente la stessa cosa di fmap
.
fmap
e liftM
fanno esattamente la stessa cosa, map
ovviamente è solo un caso speciale di loro, cioè qualcosa di diverso. fmap id getLine
è ben digitato, mentre map id getLine
non lo è.