Warum verwendet Haskell Pipes "(), um nicht verwendete Eingaben zu schließen und X (den unbewohnten Typ), um nicht verwendete Ausgaben zu schließen"?

8

Im Pipes-Tutorial heißt es das:

  

Die Synonyme für konkrete Typen verwenden () , um nicht verwendete Eingaben zu schließen, und X (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?

    
Ana 02.02.2016, 18:55
quelle

2 Antworten

6

X in Pipes wird normalerweise im restlichen Haskell-Ökosystem mit Void geschrieben, also geben wir X = Void vor. Es ist wie folgt definiert:

%Vor%

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.

    
dfeuer 02.02.2016, 19:18
quelle
3

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 ,

  • gibt es genau einen Morphismus a -> () (nämlich const () )
  • gibt es genau einen Morphismus 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.

    
leftaroundabout 02.02.2016 19:42
quelle

Tags und Links