【问题标题】:Sort list of function using sort with key in racket使用球拍中的键排序功能列表
【发布时间】:2015-03-20 15:16:24
【问题描述】:
(functionsort functionlist value)

functionsort 接受 2 个参数、函数列表和单个值。 当给定“值”时,返回按升序排序的相同函数列表。

例如:这是我的功能列表

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

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

这给了我错误

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

有什么建议吗?提前致谢

【问题讨论】:

    标签: sorting lambda scheme racket


    【解决方案1】:

    您的尝试是在正确的轨道上,但您必须为#: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
    

    【讨论】:

    • 看起来这是您在scheme 标签上的第 999 个答案?分担!!! :) :) -- 如果可以的话,这里有点挑剔:可能最好在这里使用“装饰-排序-不装饰”习语以避免函数对同一参数进行多次评估-事实证明,Racket 会自动为我们执行此操作当#:cache-keys? #t(sort ...) 调用中指定时。
    • @WillNess 好建议!我更新了我的答案。我想知道,为什么#t 不是#:cache-keys? 的默认值?
    • 我猜是因为(lambda (x) x) 是默认的#:key。 IE。对于非常便宜的钥匙来说,这完全是多余的。
    猜你喜欢
    • 2022-01-20
    • 2012-02-03
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2020-06-14
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多