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?
mape liftMdovrebbero sicuramente fare esattamente la stessa cosa di fmap.
fmape liftMfanno esattamente la stessa cosa, mapovviamente è solo un caso speciale di loro, cioè qualcosa di diverso. fmap id getLineè ben digitato, mentre map id getLinenon lo è.