浏览各种软件包的haddocks我经常会看到这样的实例文档(Control.Category):
Category k (Coercion k) Category * (->)
或者这个(Control.Monad.Trans.Identity):
MonadTrans (IdentityT *)
这种签名究竟意味着什么呢?它没有出现在源代码中,但我已经注意到它似乎发生在使用PolyKinds扩展的模块中.我怀疑它可能像TypeApplication但有一种类型.因此,例如最后一个示例意味着IdentityT
如果它的第一个参数具有类型,则它是monad变换器*
.
所以我的问题是:
我的解释是否正确以及签名所涉及的具体内容是什么?
在第一个Category
例子中,我怎么知道这k
是一种而不是一种类型?或者我只是要知道这个Category
?
这段语法的源代码是什么?
我不是要求各种解释.
引用Richard Eisenberg最近关于haskell-cafe邮件列表的帖子:
Haddock有时会努力渲染已
-XPolyKinds
启用的类型.问题是GHC通常不需要写出类型的参数,也不会打印出来(除非你说-fprint-explicit-kinds
).但是,我相信哈多克会随时打印各种各样的东西-XPolyKinds
.所以两个不同的定义实际上是相同的:它只是一个模块-XPolyKinds
而另一个没有.的
*
是那种普通的类型.所以Int
有种*
(我们写Int :: *
)同时Maybe
有种* -> *
.Typeable
实际上是善良的forall k. k -> Constraint
,这意味着它是多色的.在下面的第一个代码段,所述*
参数Typeable
实例化k
与*
,因为型变量a种类*
.
所以是的,正如你猜测的那样,它与它有关PolyKinds
.Haddock使用一种"显式类应用程序"呈现这些多边形类型.恰好Category
是多边形的,具有类型的forall k. (k -> k -> *) -> Constraint
,所以Haddock在每个实例旁边呈现类型的应用程序.
在我看来,这是Haddock的错误或错误,因为据我所知,没有相同的源代码模拟.令人困惑的是,我不知道一种更好的理解方式,而不是认识它通常表现出来的方式,并从视觉上推断出从背景中发生的事情.