Ich lief Probleme beim Spielen mit GHC.TypeLits. Betrachten Sie das folgende GADT:So verwenden Sie den Vergleich in GHC.TypeLits
data Foo :: Nat -> * where
SmallFoo :: (n <= 2) => Foo n
BigFoo :: (3 <= n) => Foo n
Mein Verständnis war, dass nun für jeden n
, der Typ Foo n
einen Wert von genau aufgefüllt wird (das entweder ein SmallFoo oder ein BigFoo auf dem Wert von n
abhängig).
Aber wenn ich jetzt ein konkretes Beispiel konstruieren wollen, wie folgt:
myFoo :: Foo 4
myFoo = BigFoo
Dann GHC (7.6.2) spuckt die folgende Fehlermeldung aus:
No instance for (3 <= 4) arising from a use of `BigFoo'
Possible fix: add an instance declaration for (3 <= 4)
In the expression: BigFoo
In an equation for `myFoo': myFoo = BigFoo
Dies scheint seltsam - ich erwartet, dass es eine vordefinierte Instanz für solche nat-Vergleiche auf Typenebene gibt. Wie kann ich diese Art von Constraints in meinem Datenkonstruktor mithilfe von Naturals auf Typenebene ausdrücken?