我正试图在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语言在这一点上不兼容。