Ist es möglich, in Haskell einen Datenkonstruktor für den partiell angewendeten Typ zu erstellen?
ghci-Sitzung:
%Vor%Ich möchte Datenkonstruktor für den Typ T1 erstellen - ist das überhaupt möglich? Oder muss ich neue Typen verwenden, weil es nicht möglich ist, eine solche Funktion manuell zu definieren?
Ich bin etwas verwirrt darüber, was dein Ziel ist, aber lass uns das Stück für Stück durchgehen, und vielleicht treffe ich den richtigen Punkt:
:t
sagt Ihnen den Typ einer Variable ; Es macht keinen Sinn, wenn es auf einen Typ angewendet wird, da es genau das zurückgibt, was Sie übergeben haben. Beachten Sie, dass die Fehler hier angeben, dass :t
eine Art von Datenwert als Parameter erwartet:
Sie können einen Teiltyp erstellen:
%Vor% Sie können keinen -Datenkonstruktor für einen Teiltyp erstellen, da sie keine Daten darstellen. Welche Werte könnte ein Maybe
oder Vector
haben, ohne für einen Typ parametrisiert zu werden? Sie könnten geneigt sein zu denken, dass Maybe
den Wert Nothing
haben könnte, aber Nothing
wird wie folgt eingegeben:
Der Schlüssel ist, dass Nothing
beliebig Maybe a
sein kann, aber es benötigt immer noch a
, um zu wissen, dass es Nothing
ist. (Es ist ungefähr so, als ob ich dir sagen würde: "Hol mir ein Glas", anstatt "hol mir ein Glas von allem" - du kannst nicht folgen, bis ich wenigstens meine Gedanken beendet habe).
Sie können durchaus partiell angewendete Funktionen erstellen, die einen vollständigen -Typ zurückgeben, sobald sie angewendet wurden :
%Vor% Es gibt bereits einen Konstruktor für T1
und er heißt Vector
:
Dies erstellt einen Typ -Konstruktor für ein Vector Int
. Beachten Sie, dass hier Vector
als -Typ -Konstruktor verwendet wird, da Sie ein type-Argument angeben. Sie können die Art vom Typ T1
mit :k
:
Dies sagt Ihnen, dass T1
ein Typkonstruktor ist, der einen konkreten Typ ( *
) verwendet und einen konkreten Typ zurückgibt.
Um einen Daten -Konstruktor zu erstellen, müssen Sie einen Daten -Wert für den ersten Parameter des Konstruktors Vector
Daten bereitstellen:
( Vector
ist sowohl ein type * -Konstruktor als auch ein data strong> -Konstruktor, weil Sie den gleichen Namen links und rechts von% verwendet haben co_de% deklaration.)
Tags und Links haskell constructor algebraic-data-types partial-application