使用排序与球拍中的键排序功能列表

时间:2015-01-21 23:00:31

标签: sorting lambda scheme racket

(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).

有什么建议吗?提前谢谢

1 个答案:

答案 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