我正在尝试在方案中定义一个过滤数字流的函数。我的函数将接收一个数字和一个流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),这是学校的工作。我希望得到帮助,以了解导致此错误的原因以及我可以采取哪些措施来解决此问题。
答案 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语言在这一点上不兼容。