Im Pipes-Tutorial heißt es das:
Die Synonyme für konkrete Typen verwenden
()
, um nicht verwendete Eingaben zu schließen, undX
(die unbewohnter Typ), um ungenutzte Ausgaben zu schließen:
Ich würde gerne verstehen, warum ()
und X
so verwendet werden, wie sie sind. Warum nicht X
oder ()
für die Ein- und Ausgänge?
X
in Pipes wird normalerweise im restlichen Haskell-Ökosystem mit Void
geschrieben, also geben wir X = Void
vor. Es ist wie folgt definiert:
Und es hat einen "Eliminator"
%Vor% Wenn Sie etwas vom Typ Void
haben (und es erzwingen), dann ist etwas falsch gelaufen . Ihr Programm hat einen Fehler verursacht, oder es ist in einer Endlosschleife stecken geblieben.
Eine Pipe erzeugen Dinge vom Typ Void
verhindert, dass jemals etwas produziert wird (legitim). Wenn es Dinge vom Typ ()
produziert, kann es Dinge produzieren, aber Dinge, die keine Informationen enthalten. Sie sind im Grunde Uhr Ticks.
Auf der Eingabeseite kann eine Pipe, die Dinge vom Typ Void
konsumiert, auf die Eingabe warten, aber sobald sie es tut, bleibt sie hängen - niemand kann sie etwas füttern. Eine Pipe, die Dinge vom Typ ()
konsumiert, kann warten, erhält aber nur Clock-Ticks.
Alle diese Optionen sind vernünftig. Ich vermute, dass Gonzalez wollte, dass das Typsystem es verbietet, dass Benutzer versehentlich einen reinen Produzenten an einen reinen Verbraucher anschließen und einen Fehler bekommen, der schwer zu finden ist. Indem ein reiner Produzent ()
konsumiert und ein reiner Konsument Void
produziert, macht er es unmöglich, sie in die falsche Richtung zu bringen.
Es ist eigentlich eine allgemeinere Sache als nur für Rohre. ()
und X
sind die Anfangs- und Endobjekte der Kategorie Hask (und von Kategorien, die von Hask abgeleitet sind, dh für alle Haskell-Typen a
,
a -> ()
(nämlich const ()
) X -> a
(nämlich absurd
). Als Konsequenz kann jede Funktionskette a -> ()
& gt; & gt; & gt; () -> b
nicht wirklich vom linken Teil abhängen (da a -> ()
keine Information trägt), und jede Kette a -> X
& gt; & gt; & gt; X -> b
kann nicht vom richtigen Teil abhängen. In diesem Sinne ist ein () -> b
-Eingabe geschlossen, ebenso ein a -> X
output.
Tags und Links haskell haskell-pipes