在Scheme中过滤流中的非素数



我正试图在scheme中定义一个函数来过滤数字流。我的函数将接收一个数字num和一个流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>

我在拉基特工作(特别是拉基特博士),这是学校的工作。我希望能得到帮助,了解是什么导致了这个错误,以及我能做些什么来修复它。

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

尽管你写道你使用的是DrRacket,但我不知道你使用的语言是什么。通常是学习语言,但在这个答案中,我认为这要么是Racket的默认语言,要么是一种合适的Scheme报告语言。

#!racket语言中,流的等效first(或car)是stream-first。有关其他产品和特殊形式,请参阅文档。

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

相关内容

  • 没有找到相关文章

最新更新