我知道Scheme/Racket中的函数(如map,foldr和filter)可以完成诸如将函数应用于元素列表等美妙事物。将函数列表应用于数字
是否可以将函数列表应用于单个元素?
我想生成每个函数产生的值,然后找到它们的最大值。谢谢。
我知道Scheme/Racket中的函数(如map,foldr和filter)可以完成诸如将函数应用于元素列表等美妙事物。将函数列表应用于数字
是否可以将函数列表应用于单个元素?
我想生成每个函数产生的值,然后找到它们的最大值。谢谢。
对于第一部分,此过程将把函数列表应用于单个参数,假定所有函数只接收一个参数。返回结果列表
(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)
另一种聪明的方式,将一个功能陆续将与折叠构成,像这样:
(define functions (list add1 abs list))
((foldl compose1 values functions) -5)
;which reduces to (list (abs (add1 (values -5))))
;which reduces to '(4)
太棒了!我无法使用APPLY工作,但这个工程很好,它的内置。谢谢! – Greg 2012-11-04 04:41:32
啊谢谢主席先生。这将做到这一点。尽管我还没有学会适用,所以我会做更多的研究。谢谢! – 2012-03-21 03:21:55
应用对于使用参数列表调用函数很有用。因此,例如(apply +(list 3 4 5))产生了12.通常情况下,可以使用fold来替换apply;在这种情况下,foldr1或foldl1。这在没有“应用”的语言中很有用,因为foldl1和foldr1是可以用任何语言(几乎任何语言)定义的“常规”函数。 – 2012-03-21 04:44:32
@John什么是foldl1和foldr1?我没有在docs.racket-lang上看到对它们的引用...是否像srfi/1的reduce? – 2012-03-21 17:07:18