Схема возвращает # <procedure>, а не значение - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь использовать неограниченную лямбду, чтобы применить произвольное количество процедур к одному аргументу. Мой код возвращает «#procedure», а не значение (я ожидал ((compose-many add1 add1 add1) 3) => 6). Пожалуйста, уточните мою ошибку. Спасибо.

(define compose-many
  (lambda args
    (lambda (x) 
      (cond
       ((null? args)
        x)
       ((null? (cdr args))
        (car args) x)
       (else (car args) (compose-many (cdr args)))))))

((compose-many add1 add1 add1) 3)

1 Ответ

0 голосов
/ 28 февраля 2020

В вашем коде, когда вы вызываете рекурсию, вы должны снова передавать значения в параметры в (lambda args (lambda (x) ...)), когда правильным будет просто перебрать аргументы. Кроме того, вы забыли на самом деле применить процедуры! Выражение наподобие этого: ((null? (cdr args)) (car args) x) игнорирует результат (car args) и просто возвращает x.

Чтобы увидеть это более четко, давайте посмотрим, как решение должно выглядеть для случая в частности, скажем - нам нужно только составить три процедуры. Обратите внимание, что мы возвращаем один lambda и как применяются процедуры:

(define (compose f g h)
  (lambda (x)
    (f (g (h x)))))

Мы должны подойти к проблеме по-другому: мы должны вернуть (lambda (x) ...) только один раз и "l oop" должен обработать список аргументов перед его возвратом. Может быть, как-то так?

(define compose-many
  (lambda args
    ; we return (lambda (x) ...) only once, is not part of the recursion
    (lambda (x)
      ; here we loop over the args list
      (define (helper args)
        (if (null? args)
            x
            ; notice the "((" here we apply the procedure!
            ((car args) (helper (cdr args)))))
      ; call the helper a single time and we're done!
      (helper args))))

((compose-many add1 add1 add1) 3)
=> 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...