【问题标题】:Scheme - list functions with filterScheme - 使用过滤器列出函数
【发布时间】:2013-03-12 12:37:03
【问题描述】:

我目前正在与 MIT 计划一起做家庭作业,并且遇到了一些据说很短的问题,尽管我对如何实施其中一些有点困惑。

一个问题要求我编写一个函数,该函数返回一个列表,其中删除了所有整数。我确实设法解决了这个问题,

(define (f2a lst) (map (lambda(x) (remove number? x)) lst))

虽然我很困惑如何重写它以不使用删除,而是使用过滤器。 *注意:(f2a '(("a" 1 "b") (2 "c") (-1 "d") (-2))) 返回'(("a" "b") ("c") ("d"))

另外两个问题我还没有找到解决办法。

他们要求我编写一个函数,该函数返回一个列表,其中删除了所有正奇数和负偶数。例如,

(f2b '(("a" 1 "b") (2 "c") (-1 "d") (-2))) 

返回

(("a" "b") (2 "c") (-1 "d"))

我有一些不正确的代码,但我感觉表明我是如何尝试解决这个问题的:

(define (f2b lst)
  (lambda(x) 
    (cond ((and (positive? x) (odd? x)) (filter x lst))
      ((and (negative? x) (even? x)) (filter x lst))
      (else "this should never print"))))

最后一个问题只是要求一个函数返回一个字符串,该字符串由附加在一个列表中的所有字符串组成。 (f2c '(("a" 1 "b") (2 "c") (-1 "d") (-2))) 返回“abcd”。

我几乎设法解决了这个问题,但是当它不断返回奇怪的值时被卡住了。这是我的代码:

(define (f2c lst)
  (lambda(x)
    (map (lambda (x) (filter string? x)) lst)
    (list x))
  (string-append (car lst) (cdr lst)))

在高阶语法方面,我仅限于映射、过滤、累加和求和。我不是要直接回答,而是要一些帮助来帮助我弄清楚我需要做什么。我的代码做错了什么?非常感谢您对此提供的任何帮助。谢谢。

【问题讨论】:

  • the documentation for remove 说,“就像过滤器,只是返回的列表只包含那些不满足谓词的元素。”因此,要使用filter 而不是remove,只需否定您的谓词即可。

标签: string list map filter scheme


【解决方案1】:

前两个问题中输入和期望输出的结构是相同的;唯一不同的是关于何时/何时不删除元素的谓词。对于第二种情况,它将是:

(define (f2b lst) 
  (map (lambda (sublst)
        (remove (lambda (x)
                  (and (number? x)
                       (or (and (positive? x) (odd?  x))
                           (and (negative? x) (even? x)))))
                 sublst))
       lst))

由于只有谓词不同,您可以将其概括为:

  (define (f2x predicate)
    (lambda (lst)
      (map (lambda (sublst) (remove predicate sublst)) lst)))
  (define f2a (f2x number?))
  (define f2b (f2x (lambda (x) 
                     (and (number? x)
                          (or (and (positive? x) (odd?  x))
                              (and (negative? x) (even? x))))))

对于您的最后一个问题,您可以将第一个问题的结果用作:

(define (f2c lst)
  (apply string-append (apply append (f2a list))))

另外,请注意您的 f2b 和 f2a 语法不正确。你正在使用

(define (func arg) 
  (lambda (x) ...))

这意味着(func arg) 返回的函数不是您想要的。

【讨论】:

  • 感谢您的解释,尽管我注意到有两件事是关闭的:对于 f2b 代码,它似乎并不完全有效,因为在运行它时,它会检查一个字符串对于整数值并返回错误(即对象“pie”,作为第一个参数传递给整数负数?,不是正确的类型)。此外,对于您在 f2c 列表上发布的代码,我无法评论这是否正确,因为在我目前正在学习的课程中,我们还没有走得足够远来使用这样的代码.
  • 我添加了号码?到谓词。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多