2012-03-21 3 views
5

Я понимаю, что функции в схеме/ракетах, такие как карта, склад и фильтр, могут делать замечательные вещи, например, применять функцию к списку элементов.Применение списка функций к номеру

Возможно ли применить список функций к одному элементу?

Я хотел бы генерировать значения, создаваемые каждой из функций, а затем найти их максимум. Спасибо.

ответ

5

Для первой части эта процедура будет применять список функций к одному аргументу, предполагая, что все функции получают только один аргумент. A список с результатами возвращается

(define (apply-function-list flist element) 
    (map (lambda (f) 
     (f element)) 
     flist)) 

Для второй части найти максимум в списке достаточно просто. Например, если элемент является 2 и перечень функций (list sin cos sqr sqrt):

(apply max 
(apply-function-list (list sin cos sqr sqrt) 2)) 

РЕДАКТИРОВАТЬ:

Вот еще один из возможных решений, без использования apply и в одной процедуре:

(define (max-list-function flist element) 
    (foldr max -inf.0 
     (map (lambda (f) (f element)) 
       flist))) 

Используйте его следующим образом:

(max-list-function (list sin cos sqr sqrt) 2) 
+1

Ах спасибо, сэр. Это сделало бы это. Я еще не научился применять, поэтому я буду делать больше исследований с моей стороны. Благодаря! –

+0

Применить полезно для вызова функции со списком аргументов. Так, например, (apply + (list 3 4 5)) производит 12. Часто бывает, что применение может быть заменено на использование fold; в этом случае foldr1 или foldl1. Это полезно на языках, которые не имеют «применять», поскольку foldl1 и foldr1 являются «регулярными» функциями, которые могут быть определены на любом языке (ну, почти любой язык). –

+0

@John Что такое foldl1 и foldr1? Я не вижу ссылки на них на docs.racket-lang ... это что-то вроде сокращения srfi/1? –

2

Другой умный способ применить одну функцию за другой, чтобы сложить с компоновать так:

(define functions (list add1 abs list)) 
((foldl compose1 values functions) -5) 
;which reduces to (list (abs (add1 (values -5)))) 
;which reduces to '(4) 
+0

Удивительный! Я не мог заставить себя использовать APPLY для работы, но это отлично работает, и он встроен. Спасибо! – Greg

Смежные вопросы