2016-07-31 9 views
2

Ich bin Fehler grob wie folgt erhalten:Aufprägezustand Art Familie forall Gleichheiten

Could not deduce T1 p (T2 p a b) ~ (a, b) 

aus einer Funktionsdeklaration, wo T1 und T2 sind Typ Familien.

Die Gleichheit gilt jedoch für alle p, a und b.

Ich kann es beheben, indem Sie fügte hinzu:

T1 p (T2 p a b) ~ (a, b) 

Aber dann etwa wie folgt ich:

Could not deduce T1 p (T2 p a c) ~ (a, c) 

Schließlich kann ich auf die Funktion genug Gleichheitsbeschränkungen hinzuzufügen, den Fehler zu töten.

Die Alternative ist, keine Funktionssignatur zu definieren, der Compiler leitet etwas Schreckliches ab, aber es funktioniert gut.

Aber ist es eine Möglichkeit, ich mich dies nur alle auf einmal abdecken kann, so etwas wie

forall p a b. T1 p (T2 p a b) ~ (a, b) 

sagen kann?

+0

Was waren 'T1' und T2' übrigens? – Alec

+0

Bitte fügen Sie ein vollständiges Beispiel von dem, was Sie versuchen, hinzu. Diese Frage ist nicht wahrnehmbar. – dfeuer

+0

"folgende Gleichheit ist wahr" - Woher weißt du, dass es wahr ist? Ist die Frage nach dem GHC-Test so, dass Sie die Typgleichheitsbedingung in Ihren Typ-Signaturen weglassen können? – chi

Antwort

0

Die wahrscheinlichste Ursache für Ihr Problem ist, dass Ihre Aussage

[Die] Gleichheit für alle p, a und b wahr ist.

ist nicht ganz richtig. Ihre behauptete Gleichheit ist

T1 p (T2 p a b) ~ (a, b) 

nehme ich Ihnen

type family P :: k 
type family A :: k 
type family B :: k 

wo keine der Familien alle Instanzen haben. Will T1 P (T2 P A B) immer noch auf (A, B) reduzieren? Wenn das der Fall ist, sollte GHC Ihre Funktion ohne Kontext annehmen. Wenn nicht, müssen Sie einige Beweise einreichen. Zum Beispiel könnten Sie Beweise dafür liefern, dass jeder Typ eine bestimmte Form hat oder nicht. Unter einem Muster, und vielleicht mit etwas mehr Hilfe, sollte die Familie reduzieren.