stream-ref 和 stream-take 在 Scheme 中给出了相互矛盾的答案

问题描述 投票:0回答:0

我在Scheme中有如下程序

#lang scheme

(require racket/stream)

(define (integers-starting-from n)
(stream-cons n (integers-starting-from (+ n 1))))




(define (stream-prefix-sum s)
  (let ((sum 0))
    (stream-map (lambda (x)
                  (set! sum (+ sum x))
                  sum)
                s)))
(define (cos-series x)
  (define (fact n)
    (if (<= n 0)
        1
        (* n (fact (- n 1)))))
  (define (term k)
    (* (/ (expt -1 k) (fact (* 2 k)))
       (expt x (* 2 k))))
  (stream-map term (integers-starting-from 0)))
(define (cos x)
  (stream-prefix-sum (cos-series x)))

(stream->list (stream-take (cos 0) 10))
(stream-ref (cos 0) 0)
(stream-ref (cos 0) 1)
(stream-ref (cos 0) 2)
(stream-ref (cos 0) 3)

我希望看到输出为:

(1 1 1 1 1 1 1 1 1 1)
1
1
1
1

但我观察到它是:

(1 1 1 1 1 1 1 1 1 1)
1
0
0
0

我不明白为什么,据我所知,

stream-ref
应该返回流的元素,而
stream-take
需要流的前 20 个元素,那么为什么它们会给出不同的结果?

流的文档

stream scheme
© www.soinside.com 2019 - 2024. All rights reserved.