自GHC 7.8起,Typeable
被多重化。查看内置Typeable
实例in the documentation的列表,我发现了一些有趣的内容:
Typeable ((* -> *) -> Constraint) Alternative
Typeable ((* -> *) -> Constraint) Applicative
Typeable (* -> Constraint) Monoid
显然,允许查看(某些)类型Constraint
的类型表示:
Prelude Data.Monoid Data.Typeable> typeRep $ (Proxy :: Proxy (Monoid Int))
Monoid Int
此功能是否有任何用途,或者它是偶然提供的?
答案 0 :(得分:10)
嗯,现在允许ConstraintKind
。因此,这意味着您可以定义通过约束参数化的数据类型。
一个(人为的)例子:
data CPair (c :: * -> Constraint) where
MkCPair :: (c a, c b) => a -> b -> CPair c
这是一对可能不同类型的两个组件,它们共享一个共同的类:
aPair :: CPair Show
aPair = MkCPair 'x' True
现在,我们希望aPair
成为Typeable
吗?这需要CPair
和Show
也是Typeable
。
deriving instance Typeable CPair
deriving instance Typeable Show
现在:
GHCi> typeOf aPair
CPair Show
因此,如果类现在可以作为类型显示,那么它只能为类派生Typeable
。
有趣的是,Typeable Show
未预先定义,但Typeable Applicative
是。{1}}。这是因为有一个新的GHC扩展AutoDeriveTypeable
似乎在某些模块中启用,但在其他模块中没有启用。使用AutoDeriveTypeable
,可以为模块中的所有内容派生Typeable
个实例,包括类。