Ракетка с двумя списками лямбда - PullRequest
0 голосов
/ 07 ноября 2018

Я попытался сделать свои первые шаги с помощью "лямбды" в Dr Racket. (Продвинутый язык)

Все было хорошо, пока я не попробовал следующий фрагмент кода:

(map (lambda (list1 list2)
     [map list (foldr + 0 (map * list1 list2 ) ) ]    )
   (list 1 2 3 4 5)
   (list 6 7 8 9 10) 
)

Я попытался максимально адаптировать свой код в соответствии с документацией Racket. Но я просто не понимаю, что здесь не так. http://docs.racket -lang.org / ссылка / pairs.html # (DEF ._ ((lib._racket / частный / map..rkt) ._ карта))

Он должен вывести один список, состоящий из результата двух элементов списка ввода с одинаковым индексом. Консольный вывод говорит:

map: 2nd argument must be a list, given 1

, тогда как 1 всегда является первым элементом списка1

Подсознание говорит, что я просто где-то напутал ().

1 Ответ

0 голосов
/ 07 ноября 2018

Вы, похоже, неправильно понимаете, что означают аргументы lambda в map. Аргументы lambda не являются списками, они являются элементами списков.

В обычной карте с одним аргументом это не так:

(map (lambda (list1)
       ....)
     (list 1 2 3 4 5))

Но на самом деле:

(map (lambda (elem1)  ; elem1 is an element of the list
       ....)
     (list 1 2 3 4 5))

То же самое с картой с двумя аргументами. Аргументами лямбды являются элементы их соответствующих списков:

(map (lambda (elem1 elem2)  ; elem1 is an element of the first list, elem2 is an element of the second list
       ....)
     (list 1 2 3 4 5)
     (list 6 7 8 9 10))

В вашем примере два списка [Listof Number], поэтому аргументы для lambda: Number.

(map (lambda (elem1 elem2) ; elem1 : Number, elem2 : Number
       ; here you have two numbers, so you can multiply them,
       ; but `map`-ing over the numbers doesn't make sense
       (* elem1 elem2))
     (list 1 2 3 4 5)   ; [Listof Number]
     (list 6 7 8 9 10)) ; [Listof Number]
...