Was ist der Zweck von algebraischen Datentypen ohne Konstruktor?

8

In Haskell können Sie einen algebraischen Datentyp ohne Konstruktor definieren:

%Vor%

Aber was ist der Zweck eines Typs (oder einer Sorte?), der keinen Konstruktor hat?

    
Henk 25.10.2015, 22:28
quelle

1 Antwort

13

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.

    
chi 25.10.2015, 22:34
quelle