Nebo to má nějaký zajímavý efekt, který mi uniká?
Ano, ve spojení s Haskellovým typovým systémem. Umožňuje to např. psát funkce typu "printf" (tzn. variabilní počet parametrů).
Nebo třeba tohle:
instance Monoid r => Monoid (a -> r) where
mempty = mempty
mappend a b = \x -> mappend (a x) (b x)
(snad jsem v tom neudělal chybu) - říká to, že když más funkci, která vrací něco v typeclass Monoid, tak i ta funkce s jedním parametrem je Monoid. No a protože funkce s jedním parametrem je pak monoid, a funkce se dvěma parametry je funkce, která "bere jeden parametr a vrací funkci s jedním parametrem", tak se ta typeclass zase použije. Takže ve výsledku funkce s libovolným počtem parametrů, která vrací Monoid, je Monoid.
Ono se to pak dá použít třeba na to, že převedeš jednu funkci na něco jiného typu... mám třeba funkci typu "Double -> Double -> String" a chci to zabudovat do nějakého interpretu jazyka a na to potřebuju naopak funkci "[Value] -> MyMonad Value". No a přes ty typeclassy se dá dělat "typový" pattern matching na "Double -> r" a tu konverzi provést.
Jinak samozřejmě vzhledem k docela masivnímu používání funkcí vyšších řádů (snad zas nepletu terminologii) je to samozřejmě obrovský syntaktická pomoc, protože pak člověk může psát třeba tyhle věci a nemusí to obalovat lambdama:
filter (> 5) [1..10]
vs.
filter (\x -> x > 5) [1..10]
sortBy (compare `on` age) people
vs.
sortBy (\a b -> compare (age a) (age b)) people