`Typeable(* - > Constraint)Monoid`实例的目的是什么?

时间:2014-04-24 19:14:20

标签: haskell

自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

此功能是否有任何用途,或者它是偶然提供的?

1 个答案:

答案 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吗?这需要CPairShow 也是Typeable

deriving instance Typeable CPair
deriving instance Typeable Show

现在:

GHCi> typeOf aPair
CPair Show

因此,如果类现在可以作为类型显示,那么它只能为类派生Typeable

有趣的是,Typeable Show未预先定义,但Typeable Applicative是。{1}}。这是因为有一个新的GHC扩展AutoDeriveTypeable似乎在某些模块中启用,但在其他模块中没有启用。使用AutoDeriveTypeable,可以为模块中的所有内容派生Typeable个实例,包括类。