Какой тип map.map в Haskell? - PullRequest
0 голосов
/ 17 июня 2019

Я хочу найти тип map.map.Первое изображение - решение, которое я нашел, но я не совсем понимаю.Мое решение было бы как на втором изображении, но это неправильно.Я не понимаю отмеченный бит решения.Почему это так?

enter image description here enter image description here

1 Ответ

3 голосов
/ 17 июня 2019

Краткий ответ : конструктор типа стрелки (->) является правосторонним ассоциативным оператором.

Стрелка ассоциативна справа. Это означает, что если вы напишите:

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]]
...