Я считаю, что я понимаю fmap . fmap для Фунтеров, но по функциям у меня болит голова уже несколько месяцев.
Я видел, что вы можете просто применить определение (.) к (.) . (.), но я забыл, как это сделать. 
Когда я сам это пробовал, это всегда получается неправильно:
(.) f g = \x -> f (g x)
(.) (.) (.) = \x -> (.) ((.) x)
\x f -> (.) ((.) x) f
\x f y  -> (((.)(f y)) x)
\x f y g-> (((.)(f y) g) x)
\x f y g-> ((f (g y)) x)
\x f y g-> ((f (g y)) x):: t2 -> (t1 -> t2 -> t) -> t3 -> (t3 -> t1) -> t
Если "просто применить определение" - единственный способ сделать это, как кто-нибудь придумал (.) . (.)? 
Должно быть какое-то более глубокое понимание или интуиция, которую мне не хватает.
