Здесь есть две карты, давайте сначала проанализируем подвыражение:
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]