LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

На этом вычисление compose останавливается, это результат

Cмотрим ещё раз, внимательней:

(define (compose f . fs)  
  (cond 
    [(null? fs) f]
    [else 
     (define rest-f (apply compose fs))
     (lambda (x) (f (rest-f x)))]))
(compose f g h)
=>
(begin
  (define rest-f (apply compose (list g h))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
    (begin
       (define rest-f1 (apply compose h))
       (lambda (x) (g (rest-f1 x))))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
    (begin
       (define rest-f1 h)
       (lambda (x) (g (rest-f1 x))))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
     (lambda (x) (g (h x))))
  (lambda (x) (f (rest-f x))))
=>
(lambda (x) (f ((lambda (x) (g (h x))) x)))

Исходная версия monk, :

На этом вычисление compose останавливается, это результат

Cмотрим ещё раз, внимательней:

(define (compose f . fs)  
  (cond 
    [(null? fs) f]
    [else 
     (define rest-f (apply compose fs))
     (lambda (x) (f (rest-f x)))]))
(compose f g h)
=>
(begin
  (define rest-f (apply compose (list g h))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
    (begin
       (define rest-f1 (apply compose h))
       (lambda (x) (f (rest-f1 x))))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
    (begin
       (define rest-f1 h)
       (lambda (x) (f (rest-f1 x))))
  (lambda (x) (f (rest-f x))))
=>
(begin
  (define rest-f 
     (lambda (x) (f (h x))))
  (lambda (x) (f (rest-f x))))
=>
(lambda (x) (f ((lambda (x) (f (h x))) x)))