【问题标题】:Filtering through a list of numbers通过数字列表过滤
【发布时间】:2015-11-23 10:48:06
【问题描述】:

这是我的咖喱函数:

(define (curry g)
  (lambda(x)
    (lambda(y)
      (g x y))))

我正在尝试使用 curry 函数生成一个不等于 1 的数字列表。

到目前为止我所拥有的是:

(define filter-numbers ((curry filter)
                       ((curry equal?) 1)))

但它只产生等于 1 的数字列表。

例如。 (filter-numbers (list 1 2 3)) -> (list 1)

我想获得(列表 2 3),但不知道如何获得。有人可以帮忙吗?

【问题讨论】:

  • 有什么理由要定义自己的咖喱函数?

标签: scheme racket


【解决方案1】:

试试这个 - 这是 Racket 中的正确方法,使用内置的 curryfilter-not 程序:

(define filter-numbers 
  (curry filter-not (curry equal? 1)))

或者,使用您的curry 实现:

(define filter-numbers 
  ((curry filter-not)
   ((curry equal?) 1)))

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

(filter-numbers '(1 2 3 4 5 1 7 1))
=> '(2 3 4 5 7)

【讨论】:

    【解决方案2】:

    过滤器功能保留满足测试的元素。你必须否定你的谓词。

    【讨论】:

      【解决方案3】:

      您可以按如下方式创建函数 my-compose:

      (define (my-compose f g)
        (lambda (x) (f (g x))))
      

      和你的咖喱函数:

      (define (curry g)
        (lambda (x) (lambda (y) (g x y))))
      

      您可以创建过滤功能(不使用过滤器)

      (define (filter-numbers lst) 
        (filter (my-compose not ( (curry  =) 1)) lst))
      
      
      (filter-numbers (list 1 2 1 1 3 4 2 ))  => (list 2 3 4 2)
      

      【讨论】:

        猜你喜欢
        • 2015-12-22
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-14
        • 1970-01-01
        • 1970-01-01
        • 2019-05-21
        相关资源
        最近更新 更多