使用 sort with key in racket 对功能列表进行排序

Sort list of function using sort with key in racket

(functionsort functionlist value)

functionsort 采用 2 个参数、函数列表和单个值。 return 相同的函数列表在给定 "value".

时按递增顺序排序

例如:这是我的函数列表

(define myfunctions (list (lambda (x) (+ x 3)) 
                     (lambda (x) (- 100 x))
                     (lambda (x) (* x 2))))
(define fs 
    (function-sort myfunctions
                   5))

应该return以下

((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 未排序。 我尝试使用

 (sort myfunctions #:key (function-sort myfunctions 10) <)

这给我错误

. . sort: contract violation
expected: (any/c . -> . any/c)
given: '(13 90 20).

有什么建议吗?提前致谢

您的尝试是在正确的轨道上,但您必须为 #:key 传递足够的参数 - 我们想要 评估 每个具有给定值的函数,并且sort 过程将根据每个函数在应用于值时返回的结果对函数的输入列表进行排序。试试这个:

(define (function-sort functions value)
  (sort functions < #:key (lambda (f) (f value))))

为了提高具有昂贵函数的大型列表的性能,请注意 Will Ness 的建议:使用 #:cache-keys? #t 将防止对同一参数进行多次评估,实际上与您打算做的类似首先是 map(即:在 排序之前预先计算值 )。考虑:

(define (function-sort functions value)
  (sort functions < #:cache-keys? #t #:key (lambda (f) (f 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)
=> 9
((second fs) 6)
=> 12
((third fs) 6)
=> 94