Потоки на Хаскеле (Comonadic): бесконечны?

Я видел потоки, используемые в качестве примера по умолчанию для comonad, но я не могу понять, насколько они бесконечны, но нет.

Предположим, у нас есть конструктор данных ( отсюда)

data Stream a = a :> Stream a

Как мы наконец добиваем поток? Мы пишем это с неопределенным в конце? Я понимаю, что язык ленив, но где-то узел должен быть разорван, верно? Я просто не прав?

1 ответ

Поток по своей сути бесконечен; Вы не можете создать конечный поток. сравнить Stream а также List:

data List   a = Empty | a :  List a
data Stream a =         a :> Stream a

Вы можете создать конечный список из-за Empty конструктор; можно создать List значение без ссылки на другое List значение. Stream значение, с другой стороны, может быть создано только с помощью другого Stream значение. Каждый раз, когда вы используете шаблон на Stream, вы получаете значение типа a и другой Stream значение.

"Завершение" потока просто означает, что вы перестали извлекать из него значения, а не то, что вы когда-либо достигали "конца" потока.

На практике это означает, что вы не можете создать полный поток в памяти; вы можете создать его только по требованию, обычно вызывая функцию для генерации остатка потока при сопоставлении с образцом на :> конструктор.

Другие вопросы по тегам