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)
有什么建议吗?提前致谢
你的尝试是在正确的轨道上,但你必须传递足够的参数#: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)