Ich habe den folgenden Datentyp:
%Vor% Dann habe ich eine Num
Instanz:
Natürlich funktioniert das nicht. Der Typ a
wird vom Konstruktor ausgeblendet, da der Typ von Var
forall (i :: Nat) a. Num a => a -> Var i
ist. Beachten Sie außerdem, dass der Konstruktor Var
nicht direkt verwendet werden soll. Var
s werden von einem intelligenten Konstruktor erstellt, der Var i0 ~ Var i1 => a0 ~ a1
garantiert. Der Typ des Var darf nicht Var i a
sein; Der Punkt besteht darin, den Typ vor dem Benutzer zu verbergen.
Wie kann ich dem Typsystem sagen, was ich "bewiesen" habe, nämlich dass Var i0 ~ Var i1 => a0 ~ a1
. Momentan verwende ich unsafeCoerce
:
Ich stelle fest, dass unsafeCoerce
in einer Assertion ist, dass zwei Typen gleich sind, aber ich möchte versuchen, diese Behauptung auf der Typ-Ebene zu machen, so dass der Export des Konstruktors nicht unsicher ist. Mit unsicher ich meine das folgende ist möglich:
Eine Möglichkeit, das Typsystem zu überzeugen, ist die Bereitstellung der Mapping-Funktion Of :: i -> a
auf Typ-Ebene. Dies erfüllt das trivial wenn i ~ i' => Of i ~ Of i'
. Hier ist die modifizierte Version Ihres Programms
Der Nachteil davon ist, dass Sie das explizite Mapping bereitstellen müssen. Es gibt vielleicht eine elegantere Methode, um deine Beschränkung auf Typenniveau festzuhalten, und ich warte darauf, dass mehr erleuchtete Menschen Einblick in diese geben.
Tags und Links haskell