2013-06-25 4 views
1

Мне сложно понять, как построить решение проблемы с домашним заданием, которое у меня есть для лямбда-выражений. Я должен написать функцию, которая принимает один аргумент, F, который является предикатной функцией и возвращает новую функцию, которая является обратным F.Вложенные функции лямбда-схемы

Я знаю, что где-то в моей функции я вернусь не к значению из переданной функции предиката, чтобы возвращать обратное, но я смущен остальной частью описания проблемы. Проблема заключается в том, что «вам понадобится лямбда внутри лямбда. Поскольку вы не знаете, сколько аргументов F примет (и может фактически принять переменное число), вам придется использовать apply и синтаксис для определения лямбда-выражения что принимает любое количество аргументов »

Я не понимаю, как настроить вложенные лямбда-выражения, чтобы делать то, что я хочу, возвращая обратное все, что может быть F. Я экспериментировал с несколькими разными вещами только для того, чтобы увидеть, могу ли я где-нибудь добраться, но я не понимаю, как вложенные лямбда-выражения работают достаточно, чтобы получить меня в любом месте.

(define converse 
    (lambda (F) 
    (lambda 
     (apply (not (F)))))) 

Я знаю, что это не будет работать, но мне нужна помощь, чтобы понять, как настроить свои вложенные выражения лямбда делать то, что я хочу.

ответ

6

Вы очень близки к ответу:

(define converse 
    (lambda (f) 
    (lambda args 
     (not (apply f args))))) 

В принципе, вы отсутствовали в args аргумент для внутреннего лямбда, который будет содержать переменное число аргументов, которые f может получить. И not наносится после, вызывая f по аргументам. Например, возьмем этот предикат с двумя аргументами:

(define (test x y) 
    (> x y)) 

Посмотрите, как это обычно работает:

(test 10 5) 
=> #t 
(test 5 10) 
=> #f 
(test 10 10) 
=> #f 

А теперь посмотрим, как он работает после того, как converse был применен к test. Обратите внимание на то, что у него не было никаких проблем дела с двумя аргументами:

((converse test) 10 5) 
=> #f 
((converse test) 5 10) 
=> #t 
((converse test) 10 10) 
=> #t 

В качестве примечания: в рэкете, то converse процедура, мы просто реализованы уже существует, и это называется negate. Мы могли бы реализовать converse так же легко, как это:

(define converse negate) 
+0

Вы, вероятно, используя язык преподавания, который не позволяет для этого: 'лямбда args'. Это обычно _works_ в Scheme, и это правильный способ определить лямбда с переменным числом аргументов, но ваш язык обучения обозначает его как ошибку. Попробуйте использовать более продвинутый язык обучения –

+0

Итак, когда я проверяю, что я получаю ошибку, требующую parens вокруг «args» во второй лямбда. Когда я делаю изменения и проверяю снова, я получаю еще одну ошибку, заявляющую, что моя процедура ожидает только 1 аргумент, но найден 2. – Yoink

+0

Нет, вы не должны добавлять круглые скобки вокруг 'args'! так мы говорим Scheme, что ожидается переменное число аргументов. Скажите, какой язык обучения вы используете? –