我知道Scheme / Racket中的函数(如map,foldr和filter)可以做很棒的事情,例如将函数应用于元素列表。
是否可以将函数列表应用于单个元素?
我想生成每个函数生成的值,然后找到它们的最大值。谢谢。
答案 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)