我在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 个元素,那么为什么它们会给出不同的结果?