2014-04-24 11 views
11

Da GHC 7.8, Typeable poly-kinded ist. Ein Blick auf die Liste der integrierten in Typeable Fällen in the documentation, bemerkte ich etwas Interessantes:Was ist der Zweck der `Typable (* -> Constraint) Monoid` Instanz?

Typeable ((* -> *) -> Constraint) Alternative 
Typeable ((* -> *) -> Constraint) Applicative 
Typeable (* -> Constraint) Monoid 

Offenbar ist es erlaubt bei Typ Darstellungen zu suchen, (bestimmte) Art von Art Constraint:

Prelude Data.Monoid Data.Typeable> typeRep $ (Proxy :: Proxy (Monoid Int)) 
Monoid Int 

Sind Gibt es irgendwelche Verwendungen für dieses Feature oder wurde es nur zufällig zur Verfügung gestellt?

Antwort

10

Nun, ConstraintKind s sind jetzt erlaubt. Das bedeutet, dass Sie Datentypen definieren können, die über Einschränkungen parametrisiert sind.

A (erfundene) Beispiel:

data CPair (c :: * -> Constraint) where 
    MkCPair :: (c a, c b) => a -> b -> CPair c 

Dies ist ein Paar von zwei Komponenten von möglicherweise unterschiedlichen Typen ist, die eine gemeinsame Klasse teilen:

aPair :: CPair Show 
aPair = MkCPair 'x' True 

Nun tun wir aPair wollen Typeable sein ? Dies erfordert sowohl CPair als auch Show bis be Typeable.

deriving instance Typeable CPair 
deriving instance Typeable Show 

Jetzt:

GHCi> typeOf aPair 
CPair Show 

So ist es nur konsequent, Typeable für Klassen abzuleiten, wenn sie als Typen jetzt erscheinen. Die lustige Sache ist, dass Typeable Show nicht vordefiniert ist, aber Typeable Applicative ist. Das liegt daran, dass eine neue GHC-Erweiterung AutoDeriveTypeable in einigen Modulen aktiviert ist, in anderen nicht. Mit AutoDeriveTypeable werden Typeable Instanzen für alles in einem Modul einschließlich Klassen abgeleitet.