Scheme forEach功能

时间:2016-10-31 20:15:18

标签: scheme

该问题要求编写满足以下交互的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)))

2 个答案:

答案 0 :(得分: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)))

答案 1 :(得分: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)))