2014-04-24 25 views
11

由於GHC 7.8,Typeable是poly-kinded。縱觀內置Typeable情況下in the documentation,我發現了一些有趣的名單:'可鍵入(* - >約束)Monoid`實例的目的是什麼?

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

顯然,這是允許的看(某些)類型的一種Constraint的類型表示:

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

是這個功能有什麼用處,或者它是不是偶然可用?

回答

10

嗯,現在允許ConstraintKind s。所以這意味着你可以定義通過約束參數化的數據類型。

A(做作)例如:

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

這是一對具有共同類潛在不同類型的兩個部分組成:

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

現在,做我們想要aPairTypeable ?這需要CPairShow到 也是Typeable

deriving instance Typeable CPair 
deriving instance Typeable Show 

現在:

GHCi> typeOf aPair 
CPair Show 

所以它只是隨之派生Typeable上課,如果他們能爲各類現在出現。

有趣的是,Typeable Show未預定義,但Typeable Applicative是。這是因爲有一個新的GHC擴展AutoDeriveTypeable似乎在某些模塊中啓用,但在其他模塊中未啓用。有了AutoDeriveTypeable,就有一個Typeable實例爲模塊中的所有內容(包括類)派生。