2015-11-10 35 views
1

我在Scheme中制作了一个函数工厂,它接收一个二元函数f,并将其调用到一个或多个变量列表中。如何使用过滤器呼叫我的功能工厂?

(define makeDoForAll 
    (lambda (f) 
    (define (helper a lst) 
     (if (null? lst) 
     a 
     (if (null? (cdr lst)) 
      (f a (car lst)) 
      (helper (f a (car lst)) 
        (cdr lst))))) 

    (lambda (x . others) 
     (helper x others)))) 

我想要使用此功能,工厂在给定的列表总结了所有偶数新的功能,从而例如(sumEvens 1 2 3 4 5)将输出6。

如何在实现过滤器(even? x)时调用功能工厂?

+0

请格式化您的代码。 – AleArk

+0

“f”应该做过滤。我的第二个参数是偶数,添加到一个。如果不是,则返回一个未更改。 – Rptx

+0

我怀疑它会起作用,因为你使用list元素作为基本情况而不通过'f'来传递它。换句话说,你的“factoried”函数对单元素列表没有任何作用。 – molbdnilo

回答

1

一些言论:

  • 嵌套if最好写成cond表达式。
  • 看起来您正在执行fold函数。

您可以生成接受一个列表,并同时执行过滤和加法,而是做你想要的是第一个过滤列表,再总结的结果元素的最简单的方式关闭:

(foldl + 0 (filter even? '(1 2 3 4 5))) 
    => 6 
+0

@molbdnilo谢谢 – coredump