Применение списка функций к числу - PullRequest
5 голосов
/ 21 марта 2012

Я понимаю, что функции в Scheme / Racket, такие как map, foldr и filter, могут делать замечательные вещи, такие как применение функции к списку элементов.

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

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

Ответы [ 2 ]

5 голосов
/ 21 марта 2012

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

(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)
2 голосов
/ 21 марта 2012

Еще один умный способ применить одну функцию за другой - сложить с помощью compose следующим образом:

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