Функции отображения Хаскелла и лямбда-выражения - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть это выражение на Хаскеле, теперь я не совсем понимаю, как это применяется.Печатая в j возвращает [2,3,4]

j :: [Int]
j = map (\a -> a 1) (map (\a x -> x + a) [1,2,3])

1 Ответ

0 голосов
/ 17 февраля 2019

Здесь есть две карты, давайте сначала проанализируем подвыражение:

map (\a x -> x + a) [1,2,3]

Мы можем записать лямбда-выражение в форме, которая, вероятно, лучше для указанного выше случая:

map (\a -> (\x -> x + a)) [1,2,3]

Итак, это функция, которая принимает параметр a и возвращает функцию.Таким образом, он вернет функцию, которая принимает параметр x, который отображается на x + a.Таким образом, это означает, что второй map создает список функций .Действительно, поэтому приведенное выше выражение эквивалентно:

[(+1), (+2), (+3)]

или более многословно:

[\x -> x+1, \x -> x+2, \x -> x+3]

здесь x s в лямбда-выражениях - это разные переменные.

Теперь первая карта берет эти функции и отображает их при вызове функции со значением один, поэтому это выражение:

map (\a -> a 1) [(+1), (+2), (+3)]

эквивалентно:

[(+1) 1, (+2) 1, (+3) 1]

и, таким образом,эквивалентно:

[2,3,4]

, как вы узнали.

Мы можем синтаксически упростить эту функцию до:

j :: Num a => [a]
j = map ($ 1) (map (+) [1,2,3])

, что семантически эквивалентно:

j :: Num a => [a]
j = map (+1) [1,2,3]

и, следовательно:

j :: Num a => [a]
j = [2,3,4]
...