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