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

box*_*oxy 3 sorting lambda scheme racket

(functionsort functionlist value)
Run Code Online (Sandbox Code Playgroud)

functionsort采用2个参数,函数列表和单个值.当给定"value"时,返回以递增顺序排序的相同函数列表.

例如:这是我的功能列表

(define myfunctions (list (lambda (x) (+ x 3)) 
                     (lambda (x) (- 100 x))
                     (lambda (x) (* x 2))))
(define fs 
    (function-sort myfunctions
                   5))
Run Code Online (Sandbox Code Playgroud)

应该返回以下内容

((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
Run Code Online (Sandbox Code Playgroud)

这是我到目前为止所得到的:

define (function-sort functions value )
   (map (lambda (y) (y value)) functions))
Run Code Online (Sandbox Code Playgroud)

计算值,9 94 12 un sorted.我试着用

 (sort myfunctions #:key (function-sort myfunctions 10) <)
Run Code Online (Sandbox Code Playgroud)

这给了我错误

. . sort: contract violation
expected: (any/c . -> . any/c)
given: '(13 90 20).
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?提前致谢

Ósc*_*pez 5

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

(define (function-sort functions value)
  (sort functions < #:key (lambda (f) (f value))))
Run Code Online (Sandbox Code Playgroud)

为了提高具有昂贵功能的大型列表的性能,请注意Will Ness的建议:使用#:cache-keys? #t将阻止对同一参数进行多次评估,并且实际上将类似于您打算首先执行的操作map(即:预计算)排序的值).考虑:

(define (function-sort functions value)
  (sort functions < #:cache-keys? #t #:key (lambda (f) (f value))))
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,它都按预期工作:

(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
Run Code Online (Sandbox Code Playgroud)

  • 看起来这是[tag:scheme]标签上的第999个答案?PAR-TAY!:) :) - 这里有点挑剔,如果我可以:最好在这里使用"decorate-sort-undecorate"成语来避免函数对同一个参数进行多次评估 - 事实证明,Racket会自动为我们这样做当`#:cache-keys?#t`在`(sort ...)`调用中指定. (3认同)