Бесконечный поток без элементов - PullRequest
0 голосов
/ 05 мая 2018

Мы только что узнали о потоках на одном из моих курсов по программированию. Я проделал свой путь уже через эти недели, назначенные задачи, кроме этой: Определить бесконечный поток, который не имеет элементов. Я уже пролистал главу 3.5 книги SICP, но до сих пор не понял, в чем заключается хитрость. Некоторые намеки были бы офигенными ты ^^

1 Ответ

0 голосов
/ 05 мая 2018

Ответ зависит от того, какой тип потоков вы используете.

В основном есть два разных типа потоков:

- empty streams
- streams consisting of an element followed by an stream

Поэтому для представления этих двух типов необходимы два разных типа значений.

В sicp пишут

Существует различимый объект, пустой поток, который не может быть результат любой операции против потока и который может быть идентифицирован с предикатом stream-null?

Один из способов определения различимого (уникального) объекта в Схеме - это выделить новая cons-ячейка - ее адрес уникален для этой ячейки.

(define the-empty-stream (list 'this-is-the-empty-stream))
(define (stream-null? x) (eq? x the-empty-stream))

В Racket можно просто использовать структуру для представления пустого потока

(struct the-empty-stream ())
(define stream-null? the-empty-stream?)

Такие функции, как stream->list, должны обрабатывать оба типа списков.

Возвращаясь к вашему вопросу: если вы используете потоки SICP, ответ прост. Выражение the-empty-stream даст вам пустой поток. Если вы определяете свой собственный, вам нужно будет выбрать способ представления пустой поток - а затем тщательно измените все функции потока, которые вы должен обрабатывать пустой поток тоже.

...