Ich versuche, eine weaken
Funktion für endliche Mengen von ganzen Zahlen zu schreiben. Ich verwende das singletons
Paket. Ich habe Additions-, Subtraktions- und Vorgängerfunktionen definiert und gefördert sowie einige Gleichungen auf ihnen getestet, um dem Typ-Checker zu helfen. Aber der Fehler, den ich bekommen habe, steht damit nicht in Zusammenhang.konnte SingI des Vorgängers nicht ableiten Nat
weaken :: forall n m k . (SingI n, SingI m, SingI k, (Minus m n) ~ NatJust k) => Fin n -> Fin m
weaken ZF = gcastWith (apply Refl $ plus_minus sm sn sk) ZF
where sn = sing :: SNat n
sm = sing :: SNat m
sk = sing :: SNat k
weaken (SF n) = gcastWith (apply Refl $ succ_pred sm) (SF (weaken n))
where sn = sing :: SNat n
sm = sing :: SNat m
sk = sing :: SNat k
Der Fehler Ich erhalte auf der rekursiven Aufruf von weaken
(SF (weaken n)
) und ist die folgende: Could not deduce (SingI n1)
, wo n1
richtig gefolgert wird der Typ-Ebene Vorgänger vom Typ n
zu sein. I könnte fügen Sie eine SingI (Pred n)
Einschränkung, aber dies bewegt einfach das Problem eine Ebene nach unten (GHC sagt jetzt, es kann nicht das Äquivalent von (SingI (Pred (Pred n)))
abzuleiten).
Wie kann ich GHC davon überzeugen, dass SingI (Pred n)
aus SingI n
folgt (und warum das singletons
Paket dies bereits tut)?