Gibt es in Haskell eine Möglichkeit, einen Datentyp durch den Wert seiner Komponenten zu begrenzen? Ich habe ein Beispiel entworfen. Angenommen, Sie haben ein Dame Spiel. Ein Prüfer ist entweder vom Typ Schwarz oder Weiß.
%Vor%Das Spielbrett für ein Schachspiel enthält eine Reihe schwarzer Steine und weiße Steine.
%Vor%Gibt es in der vorherigen Deklaration eine Möglichkeit, die Checker im ersten [Checker] als CheckerType-Schwarz und im zweiten als vom entgegengesetzten Typ zu erzwingen?
Der einfachste Weg, etwas Ähnliches zu tun, ist, den Typ Checker
mit einem sogenannten Phantom-Typ zu parametrisieren:
Beachten Sie, dass keine dieser Werte Werte hat. Sie existieren nur, um anzuzeigen, welche Farbe ein Checker
ist.
Übrigens brauchen Sie diese Klammern in der Deklaration GameBoard
nicht.
Der Nachteil dieses Ansatzes besteht darin, dass die beiden Farben nun unterschiedliche Typen sind, was bedeutet, dass Sie keine Funktion schreiben können, die beispielsweise eine Liste von Kontrollern mit mehreren Farben und nur einer einzigen Farbe enthält.
Sie könnten die Phantomtypen etwas konkreter machen, um erlaubte Farben zu verfolgen:
%Vor%Aber das kann schnell sehr mühsam werden.
Was Sie vermutlich wirklich wollen, ist eine Möglichkeit, den Bereich der erlaubten Werte in einem Kontext einzuschränken, ohne ihn in allen Kontexten zu einem komplett anderen Typ zu machen. Leider ist das in Haskell nicht wirklich einfach möglich.
Es ist eine vernünftige Idee, und einige Sprachen haben ähnliche Eigenschaften. Solche Unterscheidungen auf verallgemeinerte Art zu unterstützen, ist nicht einfach, Haskells existierendes Typsystem ohne Kollateralschaden zu ergänzen, obwohl es zB die Typinferenz weniger robust macht, sogar in Code, der kein solches Feature verwendet.
Tags und Links haskell functional-programming types declaration