Rom*_*sky 1 scheme function r5rs
如何实现一个以一个参数作为参数输入任意数量的过程并返回另一个函数的函数,是Scheme中这些过程的组成。
例如:
(define (f x) (* x 2))
(define (g x) (* x 3))
(define (h x) (- x))
((comp-func f g h) 1) => -6
((comp-func f g) 1)   => 6
((comp-func h) 1)     => -1
((comp-func) 1)       => 1
如所写,这个问题是模棱两可的,因为我们无法确定您组成函数的顺序。也就是说,我们无法确定 ((comp-func fgh)1)是计算(f(g(h 1)))还是(h(g(f 1))),因为两者都可以计算为-6 in这个案例。就是说,这个问题可以通过折或减来解决;一旦知道如何组合两个函数,就可以通过一系列函数来简化该函数。首先,编写两个函数很容易:
(define (compose2 f g)
  ;; Returns a function that computes (g (f x)).
  (lambda (x)
    (g (f x))))
现在,要将函数f折叠到具有初始值的列表(x1 x2 ... xn)上,我的意思是计算
(f ... (f (f (f i x1) x2) x3 ...) xn)
组成函数列表(f1 f2 f3 f4)只是将compose2函数与初始值(即恒等函数)折叠在一起。
(define (identity x)
  x)
(define (compose . functions)
  (reduce compose2 identity functions))
我将在顺序很重要的地方使用一些函数,以便我们可以看到结果的差异:
(define (f x) (* x x))
(define (g x) (+ x 3))
(display ((compose f g) 3))
;=> 12 == (g (f 3)) == (3^2)+3
(display ((compose g f) 3))
;=> 36 == (f (g 3)) == (3+3)^2