在Racket中无限提升序列

时间:2013-02-20 12:51:03

标签: stream scheme racket infinite-sequence

在Racket中是否有类似Python的itertools.count?我想创建一个均匀间隔数字的无限流。 in-naturals与我想要的类似,但不提供步骤。我想不要重新发明轮子,但如果没有相应的功能,怎么写一个? (我认为应该使用发电机)

2 个答案:

答案 0 :(得分:6)

您可以使用count获得与in-range相同的功能,其值为end

(define (count start step)
  (in-range start +inf.0 step))

例如:

(define s (count 2.5 0.5))

(stream-ref s 0)
=> 2.5
(stream-ref s 1)
=> 3.0
(stream-ref s 2)
=> 3.5
(stream-ref s 3)
=> 4.0

答案 1 :(得分:1)

自己完成这项功能可以在一行中完成:

(define (stream-from n s) (stream-cons n (stream-from (+ n s) s)))

为了测试它,这里是一个打印100000个数字的例子:

#lang racket
(require racket/stream)

(define (stream-from n s) (stream-cons n (stream-from (+ n s) s)))

(define (stream-while s p)
  (let ([fst (stream-first s)])
  (if (p fst) (stream-cons fst (stream-while (stream-rest s) p)) empty-stream)))

(define test (stream-while (stream-from 0 1) (λ (x) (< x 100000))))

(stream-for-each println test)