Понимание шаблона карты для n-арных операций над n списками в Scheme - PullRequest
0 голосов
/ 21 октября 2018

Я понимаю, что (map f '(a b c d)) - это '(f(a) f(b) f(c) f(d)), применяя функцию f к каждому элементу в списке.Но мне трудно понять следующее:

(map * '(1 2) '(1 2))

Вывод должен быть '(1 4).Почему?

Кто-нибудь может объяснить, как шаблон map работает в Схеме, когда мы применяем n -арную операцию к n спискам?

Ответы [ 3 ]

0 голосов
/ 21 октября 2018

'(f (a) f (b) f (c) f (d)) есть и может быть (f (a) f (b) f (c) f (d)) только после оценки.

map для одного аргумента списка можно определить так:

(define (map1 fn lst)
  (if (null? lst)
      '()
      (cons (fn (car lst))
            (map1 fn (cdr lst)))))

и (map add1 '(1 2 3)) можно заменить на

(cons (add1 '1) 
      (cons (add1 '2)
            (cons (add1 '3)
                  '())))
; ==> (2 . (3 . (4 . ())))
; ==> (2 3 4)

Теперь map занимаетпо крайней мере один аргумент списка, и он ожидает, что переданная функция будет принимать один или каждый.Таким образом, (map * '(1 2) '(1 2)) - это то же самое, что и

(cons (* '1 '1)
      (cons (* '2 '2)
            '()))
; ==> (1 . (4 . ())) 
; ==> (1 4)

Я не совсем уверен, что у вас возникли проблемы с пониманием map или как составляются списки.Если это последнее, вы должны сделать его главным приоритетом, чтобы видеть (1 2 (3 4)) и понимать, что 3 - это caaddr, поскольку пары (1 . (2 . ((3 . (4 . ())) . ()))).Прочтите это справа налево, глядя на пары, и вы увидите это.Если это map, то вам нужно их реализовать.Это лучший способ узнать это.

0 голосов
/ 21 октября 2018

Чтобы по-настоящему понять что-то, лучше всего реализовать это самостоятельно.

Карта для функций с 1 аргументом проста, это

(define (map1 f1  xs)
  (cons (f1   (car xs))
        (map1 f1
              (cdr xs))))

(добавление базового варианта оставлено в качестве упражнения).Аналогично для двух

(define (map2 f2  xs  ys)
  (cons (f2   (car xs)  (car ys))
        (map2 f2
              (cdr xs)  (cdr ys))))

и трех

(define (map3 f3  xs  ys  zs)
  (cons (f3   (car xs)  (car ys)  (car zs))
        (map3 f3
              (cdr xs)  (cdr ys)  (cdr zs))))

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

 map_n:
        xs:  x1  x2  x3  x4  x5 ...
        ys:  y1  y2  y3  y4  y5 ...
        zs:  z1  z2  z3  z4  z5 ...
        ...........................
              ↓   ↓   ↓   ↓   ↓
              f   f   f   f   f
              =   =   =   =   =
    results: r1  r2  r3  r4  r5 ...
0 голосов
/ 21 октября 2018

map берет i-ые элементы предоставленных списков, передает их n-й операции и сохраняет результат в i-й позиции возвращенного списка.

Таким образом, (map f '(a b c d) '(A B C D)) будет равнодо ((f a A) (f b B) (f c C) (f d D)).Более двух списков обрабатываются одинаково.

...