(functionsort functionlist value)
functionsort采用2个参数,函数列表和单个值。 当给定“value”时,返回以递增顺序排序的相同函数列表。
例如:这是我的功能列表
(define myfunctions (list (lambda (x) (+ x 3))
(lambda (x) (- 100 x))
(lambda (x) (* x 2))))
(define fs
(function-sort myfunctions
5))
应该返回以下内容
((first fs) 6) ; (first fs) is (lambda (x) (+ x 3))
9
((second fs) 6) ; (second fs) is (lambda (x) (* x 2))
12
((third fs) 6) ; (third fs) is (lambda (x) (- 100 x))
94
这是我到目前为止所得到的:
define (function-sort functions value )
(map (lambda (y) (y value)) functions))
计算值,9 94 12 un sorted。 我尝试使用
(sort myfunctions #:key (function-sort myfunctions 10) <)
给了我错误
. . sort: contract violation
expected: (any/c . -> . any/c)
given: '(13 90 20).
有什么建议吗?提前谢谢
答案 0 :(得分:5)
您的尝试是在正确的轨道上,但您必须为#:key
传递足够的参数 - 我们希望评估具有给定值的每个函数,以及{{1}当应用于值时,procedure将根据每个函数返回的结果对函数的输入列表进行排序。试试这个:
sort
为了提高具有昂贵功能的大型列表的性能,请注意Will Ness的建议:使用(define (function-sort functions value)
(sort functions < #:key (lambda (f) (f value))))
将阻止对同一参数进行多次评估,实际上与您打算使用{首先是{1}}(即:在排序之前预先计算值)。考虑:
#:cache-keys? #t
无论哪种方式,它都按预期工作:
map