Verhalten von Naturalien auf Typenniveau in GHC 7.8

8

Wenn Vektoren nach ihrer Länge indiziert werden sollen, können Sie Folgendes tun:

%Vor%

In ghc 7.8 hatte ich gehofft, dass dies mit den neuen Literalen veraltet würde , aber die direkte Konvertierung ist ungültig:

%Vor%

Leider gibt dies einen Fehler: NB: + 'ist eine Typ-Funktion und möglicherweise nicht injektiv'. Ich verstehe, warum das passiert, aber da die Typliterale sowieso Compilermagie sind, weiß ich nicht, warum der Compiler das auch nicht magisch machen könnte.

Ich habe versucht, Vect : (:>) :: a -> Vect (n-1) a -> Vect n a zu ändern. Auf diese Weise gibt es eine explizite Formel für den inneren Vektor, aber dies gibt den Fehler:

%Vor%

Also jetzt erfordert es einen Beweis der Grundrechenarten. Ich war nicht in der Lage, beide Versionen funktionieren zu lassen. Gibt es eine Möglichkeit, einen Beweis von (n + m) - o == (n - o) + m für den Compiler zu schreiben oder die erste Version irgendwie funktionieren zu lassen?

    
user2407038 14.05.2014, 21:19
quelle

2 Antworten

6

Naturen auf Typpegel machen immer noch keine Berechnungen. GHC 7.10 soll einen SMT-Löser integriert haben, um endlich alles zu handhaben, was Sie denken sollten.

Als theoretisch unsichere, aber funktionierende Antwort auf Ihre eigentliche Frage - unsafeCoerce existiert für den Fall, dass Sie wissen, dass zwei Ausdrücke denselben Typ haben, der Compiler jedoch nicht.

    
Carl 14.05.2014, 21:49
quelle
2

Der GHC 7.8 Solver löst immer noch nicht viele arithmetische Beziehungen mit Typennaturalen. In diesem Fall ist es jedoch absolut sicher, mit unsafeCoerce GHC zu zwingen, den beabsichtigten Typ zu erkennen.

%Vor%     
Stephen Diehl 15.05.2014 01:28
quelle