Scheme 无限流累加器

Scheme 无限流累加器,scheme,lisp,racket,Scheme,Lisp,Racket,我试图为无限流实现累加器。我已经编写了以下代码,但是它运行在一个无限循环中,并且无法终止 (define (stream-first stream) (car stream)) (define (stream-second stream) (car ((cdr stream)))) (define (stream-third stream) (car ((cdr ((cdr stream)))))) (define (stream-next stream) ((cdr stream))) (

我试图为无限流实现累加器。我已经编写了以下代码,但是它运行在一个无限循环中,并且无法终止

(define (stream-first stream) (car stream))
(define (stream-second stream) (car ((cdr stream))))
(define (stream-third stream) (car ((cdr ((cdr stream))))))
(define (stream-next stream) ((cdr stream)))


(define (stream-foldl func accum stream)
    (cond
         [(empty? stream) accum]
         [else (stream-foldl func (func (stream-first stream) accum) (stream-next stream))] ))
我已经编写了一些测试来演示我要实现的功能

(define (natural-nums)
   (define (natural-nums-iter n)
   (thunk
   (cons n (natural-nums-iter (+ n 1)))))
   ((natural-nums-iter 0)))

(define x (stream-foldl cons empty (natural-nums)))
(check-equal? (stream-first x) empty)
(check-equal? (stream-second x) (list 0))
(check-equal? (stream-third x) (list 1 0))

(define y (stream-foldl (curry + 1) 10 (naturals)))
(check-equal? (stream-first y)  10)
(check-equal?  (stream-second y) 11)
(check-equal?  (stream-third y)  13)
这是我的stream foldl函数的一个跟踪

>(stream-foldl
  #<procedure:cons>
  '()
  '(0 . #<procedure:...9/saccum.rkt:25:0>))
()>(stream-foldl
  #<procedure:cons>
  '(0)
  '(1 . #<procedure:...9/saccum.rkt:25:0>))
(0)>(stream-foldl
  #<procedure:cons>
  '(1 0)
  '(2 . #<procedure:...9/saccum.rkt:25:0>))
(1 0)>....
>(流式折叠)
#
'()
'(0 . #))
()>(流式折叠)
#
'(0)
'(1 . #))
(0)>(流式折叠)
#
'(1 0)
'(2 . #))
(1 0)>....

我认为我没有正确地设置基本情况,因此从不终止递归调用。Fold应该查看流中的每个元素,然后根据这些元素生成结果。对于无限流,折叠不会终止也就不足为奇了(你如何看待无限流中的每一个元素?)

您可以做什么:

从无限的流中产生有限的流。可以用来做那件事。
流取的示例实现

;; Returns a stream containing the first n elements of stream s.
(define (stream-take n s)
  (cond ((zero? n) empty-stream)
        ((empty? s) (error "Stream is shorter than n")
        (else
          (delay (stream-first s)
                 (stream-take (- n 1) (stream-rest s)))))))
          ; Note: 'delay' is the same as the 'thunk' in your code.

然后,使用fold或的实现折叠有限流。

cf。当然,折叠无限列表需要无限的时间。克服这一问题的一种方法是生成临时缩减值的级数(如我在那里的回答中所示)。您能否详细说明如何使用
流过滤器从无限流中获取有限流?它不会永远卡在
流中吗?
然后?@PetSerAl是的,你是对的。我的错误。编辑了答案。