Передача лямбда-функции в лямбда-функцию в схеме - PullRequest
0 голосов
/ 14 сентября 2018

Итак, у меня есть небольшая проблема.

Я пытаюсь запрограммировать это здесь:

enter image description here

Что с лямбда-исчислением упрощается до 12.

У меня есть следующий скрипт Scheme:

(
    define double (
        lambda x (
            + (car x) (car x)
        )
    )
)

(display 'Debug)
(newline)

(display (double 6))
(newline)


(
    define getTwelve (
        ((
            (lambda x (
                lambda y (
                    (display y)
                    (newline)
                    (x (x y))
                )
            ))
            double
        ) 3)
    )
)



(display getTwelve)

(newline)
(newline)

Что соответствует выходу этого терминала:

Debug
12
(3)
application: not a procedure;
 expected a procedure that can be applied to arguments
  given: '(#<procedure:double>)
  arguments...:
   '(3)

Так что, конечно, я подумал: «Это потому, что параметр double - это список, а не число», но car y просто меняет последнюю строку вывода терминала на 3.

Я думаю, что неправильно интерпретирую вывод терминала Racket, но я не знаю, каким образом. Однако существует другая возможность, что передача функции lambda в функцию lambda в качестве параметра недопустима.

Итак, мой вопрос: какой это?

1 Ответ

0 голосов
/ 14 сентября 2018

Обычно список параметров после lambda должен быть списком переменных.Вы можете использовать только одну переменную без списка, если хотите разрешить переменное число аргументов для процедуры, что здесь не так.Если вы сделаете это, каждая переменная будет связана с последовательными аргументами, и вам не нужно будет использовать car, чтобы получить значение аргумента.Так должно быть:

(define double
    (lambda (x) 
        (+ x x)))

Если вы сделаете это с getTwelve, вы получите ожидаемый результат.

(define getTwelve
  ((((lambda (x)
       (lambda (y)
         (display y)
         (newline)
         (x (x y))))
     double) 3)))

У вас также есть дополнительный набор скобок вокруг теласамой внутренней lambda.

DEMO

...