Потоки на Хаскеле (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
значение.
"Завершение" потока просто означает, что вы перестали извлекать из него значения, а не то, что вы когда-либо достигали "конца" потока.
На практике это означает, что вы не можете создать полный поток в памяти; вы можете создать его только по требованию, обычно вызывая функцию для генерации остатка потока при сопоставлении с образцом на :>
конструктор.