Function 在方案中结合两种功能
我在自己的代码中完成了过滤函数和反转函数Function 在方案中结合两种功能,function,recursion,scheme,lisp,composition,Function,Recursion,Scheme,Lisp,Composition,我在自己的代码中完成了过滤函数和反转函数 (define reverse_ (lambda (xs) (if (null? xs) xs (append (reverse_ (cdr xs)) (list (car xs)))))) 及 我想将这两个函数组合成(反向筛选)函数,即您可以键入(反向筛选符号?'(1 2 3 a b c)),它将返回->c b a 现在只需简单地键入(反向(filter)symbol?'(1
(define reverse_
(lambda (xs)
(if (null? xs)
xs
(append (reverse_ (cdr xs))
(list (car xs))))))
及
我想将这两个函数组合成(反向筛选)
函数,即您可以键入(反向筛选符号?'(1 2 3 a b c))
,它将返回->c b a
现在只需简单地键入(反向(filter)symbol?'(1 2 3 a b c))->c b a
,即可工作,但我只想将两者结合起来
对于在一般情况下以及在具体情况下提供的任何帮助,我们将不胜感激。对于一般情况,我们可以使用和程序(希望您的解释器中提供),它们允许我们操作其他程序:
((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))))
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)
(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)