【问题标题】:Map-filter CPS version in SchemeScheme中的Map-filter CPS版本
【发布时间】:2020-08-10 06:37:59
【问题描述】:

我想知道,Scheme的CPS版本中是否有map-filter的实现?

示例:

(map-filter square even? '(1 2 3 4)) -> '(4 16)  

【问题讨论】:

  • 这个问题很不清楚,也不清楚你的例子与CPS有什么关系。你能澄清一下你的意思吗?

标签: filter scheme map-function continuation-passing


【解决方案1】:

您可以使用filter&map& 定义map-filter&

(define (map-filter& proc& pred?& lst k)
  (filter& pred?&
           lst
           (lambda (new-lst)
             (map& proc& new-lst k))))

【讨论】:

    【解决方案2】:

    [此答案给出了该人描述的功能的两个版本:不是它的 CPS 版本。我认为这个问题是模棱两可的,但这可能不是正确的答案:Sylwester 的答案是。]

    如果你想要的是你所描述的(我很确定这不是 CPS),那么这样的东西可以工作:

    (define (map-filter mapper filterer lst)
      (map mapper (filter filterer lst)))
    

    在 Racket 中,这样可能会更好:

    (define (map-filter mapper filterer lst)
      (for/list ([e (in-list lst)]
                 #:when (filterer e))
        (mapper e)))
    

    这可能有更好的机会避免使用中间列表,但对我来说闻起来更难闻。

    【讨论】:

    • 这些都不是CPS
    • @Sylwester:我同意(或者在我熟悉的任何 CPS 中都不同意)。我曾假设该人正在使用他们提供的签名的函数,但我认为我现在错了:他们知道如何编写该函数但想要对其进行 CPS 转换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-13
    • 2017-11-17
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多