"添加" Scheme中的两个功能

时间:2016-02-23 03:51:23

标签: function functional-programming scheme function-composition

我正在参加我的编程语言课程的练习考试。其中一个问题是:

  

定义一个名为function+的函数,它将两个函数“添加”在一起并返回此组合。例如:

((function+ cube double) 3)
     假设合理实现函数cubedouble

应评估为216。

我不知道如何解决这个问题。我相信你应该使用lambdas的功能,但我不完全确定。

2 个答案:

答案 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 ...))所以如果你需要一个带有两个参数proc1proc2的过程,则返回一个带有任意数量参数的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