Краткий ответ : конструктор типа стрелки (->)
является правосторонним ассоциативным оператором.
Стрелка ассоциативна справа. Это означает, что если вы напишите:
map :: (d -> e) -> [d] -> [e]
более многословно, вы написали:
map :: (d -> e) -> ([d] -> [e])
Таким образом, учитывая, что первый параметр (.)
имеет тип (a -> b)
, это означает, что тип (d -> e) -> ([d] -> [e]) ~ a -> b
(~
означает тот же тип) и, таким образом, a ~ d -> e
и b ~ [d] -> [e]
. То же самое, конечно, имеет место, когда мы проверяем тип со вторым map
.
Имея это в виду, мы, подобно узлам, получаем производное:
(.) map map :: (f -> g) -> ([[f]] -> [[g]])
Таким образом, это означает, что эта функция принимает функцию типа f -> g
и отображает все элементы в списках списка в список списков, поддерживающих структуру.
Например:
Prelude> (.) map map (+1) [[1,4,2,5], [], [1,3], [2]]
[[2,5,3,6],[],[2,4],[3]]