Scheme实现流截取过程stream-take出现contract violation错误如何处理
报错原因
- 参数传递逻辑错误:你在递归调用
stream-take时提前对(cdr stream)执行了force操作,破坏了流的标准结构,最终导致参数错位,把流的pair结构(2 . #<promise>)传入了数值参数n的位置,执行= n 0判断时触发类型不匹配的错误。 - 流操作使用不规范:流有专属的取值操作
stream-car、stream-cdr,你使用普通序对的car、cdr操作流,不符合流的结构约定,同时构造流时用了普通cons,普通cons会立刻计算第二个参数的值,无法实现流的延迟计算特性,正确的流构造应该使用cons-stream,它会自动对第二个参数做延迟封装。 - 边界条件返回错误:
n=0的分支中你写了('()),多余的括号会被解释为把空列表作为函数调用,且边界条件应该和流为空的分支保持一致,返回the-empty-stream而不是普通空列表。
修正后的代码
(define (stream-take n stream) (cond ((stream-null? stream) the-empty-stream) ((= n 0) the-empty-stream) (else (cons-stream (stream-car stream) (stream-take (- n 1) (stream-cdr stream)))))) (stream-take 10 nats)
内容的提问来源于stack exchange,提问作者N.A.
相关产品推荐
相关产品推荐

