将函数列表应用于数字

时间:2012-03-21 02:49:44

标签: scheme racket

我知道Scheme / Racket中的函数(如map,foldr和filter)可以做很棒的事情,例如将函数应用于元素列表。

是否可以将函数列表应用于单个元素?

我想生成每个函数生成的值,然后找到它们的最大值。谢谢。

2 个答案:

答案 0 :(得分:5)

对于第一部分,此过程将函数列表应用于单个参数,假设所有函数只接收一个参数。返回包含结果的列表

(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 :(得分:2)

另一种巧妙的方法是将一个接一个地应用于一个函数,然后用这样的组合折叠:

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