从Scheme中的流中过滤非素数

时间:2015-03-03 18:07:38

标签: filter stream scheme racket

我正在尝试在方案中定义一个过滤数字流的函数。我的函数将接收一个数字和一个流s并过滤掉num是流中数字因子的位置。

我的代码目前看起来像这样:

(define filter$
  (lambda (num s)
    (if (or (= num 0)(null? s))
        '()
        (if (= (modulo (car s) num) 0)
            (filter$ num (cdr s))
            (cons (car s) (filter$ num (cdr s)))))))

我目前收到错误:

car: contract violation
expected: pair?
given: #<procedure:... saved location of file/location of the error>

我在Racket工作(特别是DrRacket),这是学校的工作。我希望得到帮助,以了解导致此错误的原因以及我可以采取哪些措施来解决此问题。

1 个答案:

答案 0 :(得分:2)

流与列表不同。您不能只使用car,因为car仅适用于对。

即使你写道你正在使用DrRacket我也不知道你在使用什么语言。通常它是学习语言,但在这个答案中我认为它是Racket的默认语言或正确的Scheme报告语言。

使用#!racket语言,流的first(或car)相当于stream-first。对于其余的产品和特殊形式see the documentation.

对于Scheme语言(例如#!r6rs#!r5rs),您可以使用SRFI-40。这里是stream-car,而不是stream-first,因此Scheme和Racket语言在这一点上不兼容。