我正在参加我的编程语言课程的练习考试。其中一个问题是:
定义一个名为
function+
的函数,它将两个函数“添加”在一起并返回此组合。例如:假设合理实现函数((function+ cube double) 3)
cube
和double
,应评估为216。
我不知道如何解决这个问题。我相信你应该使用lambdas的功能,但我不完全确定。
答案 0 :(得分:1)
如果您需要一个程序,允许您两个人组成一元程序(只有一个参数的程序),那么在看到实施的简单之后,您就会自我介绍
(define (function+ f g)
(λ (x) (f (g x))))
(define (cube x)
(* x x x))
(define (double x)
(+ x x))
((function+ cube double) 3)
;=> 216
答案 1 :(得分:0)
基本上如果你需要这样做,你只需执行(x (y args ...))
所以如果你需要一个带有两个参数proc1
和proc2
的过程,则返回一个带有任意数量参数的lambda 。您只需使用apply将proc1
参数作为列表并将结果传递给proc2
。它看起来像这样:
(define (compose-two proc2 proc1)
(lambda args
...))
一般撰写稍微复杂一点,因为它需要任意数量的参数:
#!r6rs
(import (rnrs))
(define my-compose
(let* ((apply-1
(lambda (proc value)
(proc value)))
(gen
(lambda (procs)
(let ((initial (car procs))
(additional (cdr procs)))
(lambda args
(fold-left apply-1
(apply initial args)
additional))))))
(lambda procs
(cond ((null? procs) values)
((null? (cdr procs)) (car procs))
(else (gen (reverse procs)))))))
(define (add1 x) (+ x 1))
((my-compose) 1) ;==> 1
((my-compose +) 1 2 3) ; ==> 6
((my-compose sqrt add1 +) 9 15) ; ==> 5