Вы должны составить функции, которые вы получаете в параметре f
. Для простоты предположим, что в списке есть только две функции - тогда вам нужно применить первую функцию к текущему элементу в списке чисел, а затем применить вторую функцию к результату этого. Если вы можете использовать compose
процедура идти вперед с ним и изменить эту строку в коде:
((car f) (car l)) ; you're applying only the 1st function! what about the 2nd?
... с этим один:
((compose (cadr f) (car f)) (car l)) ; now we're applying both functions
Если вы не можете использовать compose
, а затем заменить в той же строке с этим:
((cadr f) ((car f) (car l))) ; now we're applying both functions
Теперь, если проблема носит более общий характер, и вы должны отобразить список функций с более чем двумя элементов, а затем еще раз заменить ту же строку в коде с этим:
((compose-multi f) (car l))
И реализовать вспомогательную функцию, которая сочиняет и возвращает все функции в списке, последовательными вызовами compose
. Это одно упражнение для вас, учитывая, что это домашнее задание, но если вы понимаете, как приведенный выше код работает только для двух функций, должно быть достаточно просто расширить результат для списка нескольких функций:
(define (compose-multi flist) ; procedure for composing a list of functions
(if (null? flist) ; if the list is empty then
<???> ; return the identity function
(<???> (compose-multi <???>) ; else compose the result of recursive call
<???>))) ; with the current element in the list
Обратите внимание, что функция идентификации требуется для обработки случая, когда в списке функций нет элементов; его очень просто определить, он просто возвращает то же значение, которое было передано как параметр.
Также следует знать, что compose-multi
возвращает функцию, результат составления всех функций в списке - compose
делает это для вас, но если вы не можете использовать его только помните, что это:
(compose x y)
... эквивалентно следующему:
(lambda (n) (x (y n)))
Это звучит, как вы хотите, чтобы применить состав функций в списке (если ваш пример есть 'квадрат 'а не' double', чтобы показать результат?). Вы можете найти ответы на этот вопрос полезным: http://stackoverflow.com/questions/9919732/a-function-builder-in-scheme/9920006#9920006. –
Извините, да, он должен быть квадратным. – user1405177
Сколько функций может быть передано в списке функций? всегда два? менее двух? более двух? –