自GHC 7.8以来,Typeable
是多元化的.查看文档中的内置Typeable
实例列表,我注意到一些有趣的事情:
Typeable ((* -> *) -> Constraint) Alternative
Typeable ((* -> *) -> Constraint) Applicative
Typeable (* -> Constraint) Monoid
Run Code Online (Sandbox Code Playgroud)
显然,它允许查看(某些)类型的类型表示Constraint
:
Prelude Data.Monoid Data.Typeable> typeRep $ (Proxy :: Proxy (Monoid Int))
Monoid Int
Run Code Online (Sandbox Code Playgroud)
这个功能有什么用途,还是只是偶然提供?
kos*_*kus 10
嗯,ConstraintKind
现在允许s.这意味着您可以定义通过约束参数化的数据类型.
一个(人为的)例子:
data CPair (c :: * -> Constraint) where
MkCPair :: (c a, c b) => a -> b -> CPair c
Run Code Online (Sandbox Code Playgroud)
这是一对可能不同类型的两个组件,它们共享一个公共类:
aPair :: CPair Show
aPair = MkCPair 'x' True
Run Code Online (Sandbox Code Playgroud)
现在,我们想aPair
成为Typeable
吗?这既需要CPair
和Show
要Typeable
为好.
deriving instance Typeable CPair
deriving instance Typeable Show
Run Code Online (Sandbox Code Playgroud)
现在:
GHCi> typeOf aPair
CPair Show
Run Code Online (Sandbox Code Playgroud)
因此,Typeable
如果它们现在可以作为类型出现,那么它只会导致派生类.
有趣的是,这Typeable Show
不是预定义的,而是Typeable Applicative
.这是因为有一个新的GHC扩展AutoDeriveTypeable
似乎在某些模块中启用,但在其他模块中没有启用.有AutoDeriveTypeable
,有一些Typeable
实例派生于模块中的所有内容,包括类.
归档时间: |
|
查看次数: |
284 次 |
最近记录: |