2012-03-21 76 views
5

我知道Scheme/Racket中的函数(如map,foldr和filter)可以完成诸如将函数应用于元素列表等美妙事物。将函数列表应用于数字

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

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

回答

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

啊谢谢主席先生。这将做到这一点。尽管我还没有学会适用,所以我会做更多的研究。谢谢! – 2012-03-21 03:21:55

+0

应用对于使用参数列表调用函数很有用。因此,例如(apply +(list 3 4 5))产生了12.通常情况下,可以使用fold来替换apply;在这种情况下,foldr1或foldl1。这在没有“应用”的语言中很有用,因为foldl1和foldr1是可以用任何语言(几乎任何语言)定义的“常规”函数。 – 2012-03-21 04:44:32

+0

@John什么是foldl1和foldr1?我没有在docs.racket-lang上看到对它们的引用...是否像srfi/1的reduce? – 2012-03-21 17:07:18

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 2012-11-04 04:41:32