Maschinen auf Typenebene erfordern oft Typen, die aber solche Werte niemals konstruieren.
z. B. Phantomtypen:
%Vor% Solange der Konstruktor S
nicht vom Modul exportiert wird, kann der Benutzer dieser Bibliothek den Status "checked" im Datentyp Stuff
nicht fälschen.
Oben muss die Funktion workWithChecked
die Eingabe bei jedem Aufruf nicht bereinigen. Der Benutzer muss es bereits getan haben, da es einen Wert vom Typ "checked" bereitstellen muss - und das bedeutet, dass der Benutzer vorher die Funktion check
aufrufen musste. Dies ist ein effizientes und robustes Design: Wir wiederholen nicht bei jedem Anruf dieselbe Überprüfung, und dennoch erlauben wir dem Benutzer nicht, ungeprüfte Daten zu übergeben.
Beachten Sie, dass die Werte der Typen Checked
, Unchecked
unwesentlich sind - wir verwenden diese nie.
Wie andere in Kommentaren erwähnt haben, gibt es viele andere Verwendungen von leeren Typen als Phantomtypen. Zum Beispiel beinhalten einige GADTs leere Typen. ZB
%Vor%Oben verwenden wir leere Typen, um Längeninformationen in Typen aufzuzeichnen.
Außerdem werden Typen ohne Konstruktoren benötigt, um einige theoretische Eigenschaften zu erreichen: Wenn wir nach einem a
suchen, so dass Either a T
isomorph zu T
ist, wollen wir, dass a
leer ist. In der Typentheorie wird ein leerer Typ üblicherweise als Typäquivalent eines logisch "falschen" Satzes verwendet.
Tags und Links haskell types algebraic-data-types