2016-10-31 83 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)))