2014-04-24 7 views
11

Ponieważ GHC 7.8, Typeable jest poly-kinded. Patrząc na listę wbudowanych Typeable przypadkach in the documentation, zauważyłem coś ciekawego:Jaki jest cel instancji `Typeable (* -> Constraint) Monoid`?

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

Widocznie, to wolno patrzeć typu przedstawień (niektórych) rodzaje rodzaju Constraint:

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

Czy czy istnieją jakieś zastosowania tej funkcji, czy też udostępniono ją przypadkowo?

Odpowiedz

10

Cóż, ConstraintKind s są teraz dozwolone. Oznacza to, że można zdefiniować typy danych sparametryzowane przez wiązania.

A (wymyślony) przykład:

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

To jest para dwóch składników potencjalnie różnych typów, które mają wspólną klasę:

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

Teraz chcemy aPair być Typeable ? Wymaga to także zarówno CPair i Show do.

deriving instance Typeable CPair 
deriving instance Typeable Show 

Teraz:

GHCi> typeOf aPair 
CPair Show 

Więc to tylko konsekwentna czerpać Typeable do zajęć, czy mogą pojawić się jako typy teraz.

Zabawne jest to, że Typeable Show nie jest predefiniowany, ale jest Typeable Applicative. Jest tak dlatego, że istnieje nowe rozszerzenie GHC AutoDeriveTypeable, które wydaje się być włączone w niektórych modułach, ale nie w innych. W przypadku AutoDeriveTypeable istnieją instancje od Typeable dla wszystkich elementów w module, w tym klas.