Помогите создать карту схемы-множество функций

#scheme

#схема

Вопрос:

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

Я придумал следующее, но получаю сообщение об ошибке:

  : expects type <number> as 1st argument, given: (1 2 3); other arguments were: 1
  

когда я пытаюсь использовать функцию с образцом ввода, (map-many (list (lambda (x) ( x 1)) (lambda (x) (* x x))) '(1 2 3)) . Любые предложения будут оценены.

 (define (map-many fun-list lst)
    (if (null? lst) lst
        (map ((car fun-list) lst)
             (map-many (cdr fun-list) lst))))
  

Ответ №1:

 (define (map-many fun-list lst)
  (if (null? fun-list) lst
      (map (car fun-list)
           (map-many (cdr fun-list) lst))))
  

Ваши ошибки были:

  1. Вы завершаете рекурсию на (null? lst) вместо (null? fun-list) .
  2. Остальная часть функции была нелогичной.

Комментарии:

1. 1 Хороший улов в (null? lst) vs (null? fun-list) штуке!

Ответ №2:

Вы передаете не ту функцию map . Вместо передачи ((car fun-list) lst) попробуйте передать просто (car fun-list) .

Ответ №3:

Ваша формулировка мне немного непонятна. Предполагается ли, что вы должны сделать следующее? Есть два списка, один из процедур (назовем этот список P), другой со значениями (назовем этот список V). Итак, вы хотите затем найти список, в котором:

  • список-ссылка 0 = (P0 V0)
  • список-ссылка 1 = (P1 (P0 V1))
  • список-ссылка 2 = (P2 (P1 (P0 V2))

и так далее?

 (define (map-many procs vals)
   (let ((applied (map (car procs) vals))
     (if (null? vals)
         vals
         (cons (car applied) (map-many (cdr procs) (cdr applied)))))))
  

Комментарии:

1. Функция должна работать следующим образом (map (apply compose fun-list) lst) .