Scheme 将函数列表应用于数字

Scheme 将函数列表应用于数字,scheme,racket,Scheme,Racket,我知道Scheme/Racket中的函数,如map、foldr和filter,可以做一些奇妙的事情,比如将函数应用于元素列表 是否可以将函数列表应用于单个元素 我想生成每个函数产生的值,然后找到它们的最大值。谢谢。对于第一部分,假设所有函数只接收一个参数,本过程将对单个参数应用函数列表。返回一个包含结果的列表 (define (apply-function-list flist element) (map (lambda (f) (f element)) fl

我知道Scheme/Racket中的函数,如map、foldr和filter,可以做一些奇妙的事情,比如将函数应用于元素列表

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


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

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

(define (apply-function-list flist element)
  (map (lambda (f)
         (f element))
       flist))
对于第二部分,在列表中查找最大值非常简单。例如,如果元素是
2
,函数列表是
(list sin cos sqr sqrt)

编辑:

以下是另一种可能的解决方案,无需使用
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)

另一种巧妙的方法是一个接一个地应用一个函数,即使用compose进行折叠,如下所示:

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

啊,谢谢你,先生。那就行了。我还没有学会申请,所以我会做更多的研究。谢谢Apply用于调用具有参数列表的函数。例如,(apply+(list 3 4 5))生成12。通常情况下,应用可替换为使用折叠;在本例中,使用foldr1或foldl1。这在没有“应用”的语言中很有用,因为foldl1和foldr1是“常规”函数,可以用任何语言定义(嗯,几乎任何语言都可以定义)。@John foldl1和foldr1是什么?我看不到文件上有提到他们。敲诈勒索。。。是不是有点像srfi/1的reduce?啊。。我懂了。申请和地图有很大的相似性吗?它们的功能似乎很相似。类似的东西可以用于列表而不是数字吗?太棒了!我无法将自己的应用程序应用到工作中,但这非常有效,而且是内置的。谢谢
(define functions (list add1 abs list))
((foldl compose1 values functions) -5) 
;which reduces to (list (abs (add1 (values -5)))) 
;which reduces to '(4)