Ho riscontrato problemi con GHC.TypeLits. Si consideri il seguente GADT:Come utilizzare il confronto in GHC.TypeLits
data Foo :: Nat -> * where
SmallFoo :: (n <= 2) => Foo n
BigFoo :: (3 <= n) => Foo n
La mia comprensione è che ora ogni n
, il tipo Foo n
è popolato da esattamente un valore (ovvero uno SmallFoo o un BigFoo a seconda del valore della n
).
Ma se ora voglio costruire un esempio concreto come segue:
myFoo :: Foo 4
myFoo = BigFoo
Poi GHC (7.6.2) sputa fuori il seguente messaggio di errore:
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
Questo sembra strano - I ci si aspetta che ci sia un'istanza predefinita per tali confronti di livello di tipo nat. Come posso esprimere questo tipo di vincoli nel mio costruttore di dati utilizzando i tipi di livello naturali?