2017-06-06 7 views
1

Ich habe Streams als Standard-Beispiel für ein Comonad gesehen, aber ich kann nicht ganz verstehen, wie sie unendlich sind, aber nicht.Haskell Streams (Comonadic): Unendlich?

nehmen wir die Daten Konstruktor (from here)

data Stream a = a :> Stream a 

Wie erfolgreich abgeschlossen werden wir schließlich einen Strom haben? Schreiben wir es am Ende undefiniert? Ich verstehe, dass die Sprache faul ist, aber irgendwo muss der Knoten geschnitten werden, oder? Bin ich nur falsch?

+5

Wenn du es fertig hast, wird es nicht mehr unendlich sein, oder? –

Antwort

6

Ein Strom ist von Natur aus unendlich; Sie können keinen endlichen Stream erstellen. Vergleichen Stream und List:

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

Sie können eine endliche Liste erstellen, da der Empty Konstruktor; Es ist möglich, einen List Wert ohne Bezugnahme auf einen anderen List Wert zu erstellen. A Stream Wert, auf der anderen Seite kann nur mit anderenStream Wert erstellt werden. Beliebig Zeit, die Sie Muster auf einem Stream übereinstimmen, erhalten Sie einen Wert vom Typ a und einen anderen Stream Wert.

"Beenden" eines Streams bedeutet einfach, dass Sie aufhören, Werte daraus zu ziehen, nicht dass Sie jemals das "Ende" des Streams erreichen.

In der Praxis bedeutet dies, dass Sie keinen vollständigen Stream im Speicher instanziieren können; Sie können es nur bei Bedarf erstellen, indem Sie normalerweise eine Funktion aufrufen, um den Rest des Streams beim Mustervergleich für den :>-Konstruktor zu generieren.

+3

Während denotational völlig vernünftig ist, ist der letzte Absatz (über "instantiating [einen vollständigen Strom im Speicher]") nicht operativ korrekt - das ist genau das, was Knotenbindung Ihnen gibt! Wenn zum Beispiel die Definition "Einsen = 1:> Einsen" gegeben wird, wird der Strom durch eine einzelne "Cons" -Zelle mit einem Zeiger zurück zu sich selbst dargestellt (sobald die Thunks verschwunden sind). –

+2

Ein realistischeres Szenario ist der Strom der vom Benutzer gedrückten Tasten: Sie behandeln dies als einen unendlichen Strom, weil es nie einen Tastendruck gibt, von dem bekannt ist, dass er der letzte ist (ignorieren Sie ctrl-D vorerst). Die Beendigung tritt auf, wenn das Programm endet, nicht wenn der Stream endet. –

+0

@ AntalSpector-Zabusky das würde gut als Antwort funktionieren. Auch, also sind alle Ströme dann kreisförmig? –