Бесконечная восходящая последовательность в ракетке

Есть ли аналог Питона? itertools.count в ракетку? Я хочу создать бесконечный поток из равномерно распределенных чисел. in-naturals похоже на то, что я хочу, но не обеспечивает шаг. Я бы не хотел изобретать велосипед, но если нет эквивалентной функции, как ее написать? (Полагаю, следует использовать генераторы)

2 ответа

Решение

Вы можете получить такую ​​же функциональность Python 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

Самостоятельно выполнить функцию можно в одной строке:

(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)
Другие вопросы по тегам