Ještě jeden hezký příklad - tohle je takový "víceparametrový" fmap. Není potřeba používat funkce typu "liftA2", "liftA3" podle počtu parametrů, ale dá se to napsat takhle:
{-# LANGUAGE TupleSections #-}
(,) <$> (neco1 :: Maybe x) <*> (neco2 :: Maybe y)
(,,) <$> (neco1 :: Maybe x) <*> (neco2 :: Maybe y) <*> (neco3 :: Maybe z)
-- Zavorkovani
(((,,) <$> neco1) <*> neco2) <*> neco3
No a když se podíváš na implementaci "fmap"(<$>) a "ap" (<*>), tak vlastně každý z těch kroků zavolá tu funkci s jedním parametrem a vrátí se mu funkce, vyžadující o parametr míň.