2016-10-31 3 views
0

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

(define iterator (forEach (list 1 2 3 4 5))) 
(iterator (lambda (x)(* x x))) → (1 4 9 16 25) 
(iterator (lambda (x)(* x 10))) → (10 20 30 40 50) 

Я не могу понять, как это понять. Вот как я начал, но я мог бы быть далеко:

(define (map procedure items) 
    (if (null? items) 
     '() 
     (cons (procedure (car items)) 
       (map procedure (cdr items))))) 

(define (forEach l) (lambda (x) 
     (cond ((not (null? l)) 
     (x (car l)) 
     (forEach (map x (cdr l))))))) 

(define iterator (forEach (list 1 2 3 4 5))) 
(iterator (lambda (x)(* x x))) 
(iterator (lambda (x)(* x 10))) 

ответ

0

Ваш forEach возвращает функцию, которая принимает функцию map над списком, который находится в закрытии.

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

Обратите внимание, что forEach соответствует CamelCase и не lisp-case, что является более распространенным соглашением об именах в языках lisp. Правильное имя будет for-each. К сожалению, это имя имеет более высокий порядок, который делает то же самое, что и map, но не накапливает результат.

Вот то, что вы пытаетесь как рекурсивное решение, которое не использует map:

(define (iterate lst) 
    (lambda (fn) 
    (define (aux lst) 
     (if (null? lst) 
      '() 
      (cons (fn (car lst)) 
       (aux (cdr lst))))) 
    (aux lst))) 

(define iterator (iterate '(1 2 3))) 
(iterator -) ; ==> (-1 -2 -3) 

aux делает довольно много, что map делает за исключением того, что имеет fn от закрытия, поэтому мы можем считать, что и использовать вашу версию пропусканием fn:

(define (iterate lst) 
    (lambda (fn) 
    (map fn lst))) 
0
forEach

принимает список и возвращает функцию.
Эта возвращаемая функция должна принимать другую функцию и применять ее к каждому элементу списка.
«Применить функцию к каждому элементу списка» является то, что делает map:

(iterator (lambda (x)(* x x))) → (map (lambda (x)(* x x)) (list 1 2 3 4 5)) 
(iterator (lambda (x)(* x 10))) → (map (lambda (x)(* x 10)) (list 1 2 3 4 5)) 

Таким образом, все, что вам нужно, это

(define (forEach ls) 
    (lambda (fn) (map fn ls))) 
Смежные вопросы