n arity zip функция в схеме (проблемы с apply и map)

У меня проблемы с вызовом карты по списку списков.

01>(define (foldr f accum xs)
  (if (null? xs) accum
      (f (car xs) (foldr f accum (cdr xs)))))

02> (map (lambda xs foldr cons '() xs) '(1 2) '(3 4) '(5 6))

((1 3 5) (2 4 6))

это то, что мы хотим, но я не могу заставить это работать из вызываемой функции.

РЕДАКТИРОВАТЬ -- (map (lambda x x) '(1 2) '(3 4) '(5 6)) дает тот же результат!

03> (define (zip . xs)
    (map (lambda ys foldr cons '() ys) xs)))

04> (zip '(1 2) '(3 4) '(5 6))

(((1 2)) ((3 4)) ((5 6)))

Я вижу проблему в том, что аргументы, передаваемые в zip, становятся списком, но я не знаю, как продолжать обрабатывать их, как в рабочей версии.

Я не уверен как apply используется с картой

05> (define zip
  (lambda xs
    (apply (map (lambda ys foldr cons '() ys)) xs)))

06> (zip '(1 2) '(3 4) '(5 6))

*** ERROR IN zip, (stdin)@546.12 -- Wrong number of arguments passed to procedure (map '#<procedure #49>)

это имеет смысл, так как карта ничего не вызывает.;; но тогда как мы можем применить map к тем же аргументам, которые map вызывает для функции fold?

07> (define (zip . args)
  (apply (lambda xs (map (lambda ys foldr cons '() ys) xs)) args))

08> (zip '(1 2) '(3 4) '(5 6))

(((1 2)) ((3 4)) ((5 6)))

это то же самое с первой попытки. Я уверен (... надеюсь), что мне здесь не хватает чего-то крошечного.

2 ответа

Решение

zip функция в моей стандартной прелюдии.

> (define (zip . xss) (apply map list xss))
> (zip '(1 2 3) '(a b c))
((1 a) (2 b) (3 c))
> (zip '(1 2 3) '(a b c) '(x y z))
((1 a x) (2 b y) (3 c z))
(define (zip . xs)  
 (if (null? (car xs))
      '()
      (cons (map car xs)
            (apply zip (map cdr xs)))))

(zip '(1 2)' (3 4) '(5 6))

; Значение 13: ((1 3 5) (2 4 6))

Как вы можете видеть, это не совсем соответствует шаблону карты. Поведение, которое вы наблюдаете ранее, является немного нестандартным, когда map предоставила функцию, и несколько списков вернут список, созданный путем применения функции к соответствующим терминам в списках.

Их способ повторно представить поведение - использовать apply, но вы не можете напрямую применить карту, и сделать это правильно в анонимной функции сложно.

Вы были на хорошей трассе с

(define (zip. args) (применить (лямбда хс (карта (лямбда и фолс минусы '() и)))))

Но это не использует особое поведение, замеченное ранее. Где эти xs of xs)) args), где вы хотите увидеть first-xs second-xs ... last-xs) и для того, чтобы сделать это таким образом, по всей вероятности, требуется макрос

Вам лучше просто реализовать логику метода multi-map напрямую.

Другие вопросы по тегам