结合Scheme中的两个函数

时间:2016-12-07 15:36:38

标签: function recursion scheme lisp composition

我在我自己的代码中完成了filter-function和reverse-function

(define reverse_
  (lambda (xs)
    (if (null? xs)
        xs
        (append (reverse_ (cdr xs))
                (list (car xs))))))

(define filter_
  (lambda (p? xs)
    (if (null? xs)
        xs
        (append (if (p? (car xs))
                    (list (car xs))
                    (list))
                (filter_ p? (cdr xs))))))

我想将这两个函数合并到(reverse-filter)函数中,即您可以键入(reverse-filter symbol? '(1 2 3 a b c)),它将返回-> c b a

现在只需输入(reverse_ (filter_ symbol? '(1 2 3 a b c))) -> c b a就可以了,但我只想将两者结合起来。

在一般情况下以及在特定情况下执行此操作的任何帮助都将非常感谢

2 个答案:

答案 0 :(得分:2)

对于一般情况,我们可以使用currycompose程序(希望在您的翻译中可用),它们允许我们操纵其他程序:

((compose (curry filter_ symbol?) reverse_)
 '(1 2 3 a b c))
=> '(c b a)

为了说明的目的,这里是两个程序的简单实现,以了解他们在幕后所做的事情:

(define (curry f x)
  (lambda (y) (f x y)))

(define (compose f g)
  (lambda (x) (f (g x))))

答案 1 :(得分:0)

compose是正确和懒惰的事情,但是因为列表是从头到尾迭代但是从头到尾创建,所以反过来创建反向结果实际上是一次性完成后更有效:

(define (reverse-filter p? xs)
  (define (helper lst acc)
    (if (null? lst)
        acc
        (helper (cdr lst)
                (let ((a (car lst)))
                  (if (p? a)
                      (cons a acc)
                      acc)))))
  (helper xs '()))

(reverse-filter symbol? '(1 2 3 a b c))
; ==> (c b a)