Stellen Sie sicher, dass ein Datenkonstruktor injektiv ist

8

Ich habe den folgenden Datentyp:

%Vor%

Dann habe ich eine Num Instanz:

%Vor%

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 :

%Vor%

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:

%Vor%     
user2407038 18.10.2013, 07:04
quelle

1 Antwort

5

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

%Vor%

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.

    
Satvik 18.10.2013 07:19
quelle

Tags und Links