jpa*_*ath 6 haskell haddock type-kinds polykinds
浏览各种软件包的haddocks我经常会看到这样的实例文档(Control.Category):
Category k (Coercion k)
Category * (->)
Run Code Online (Sandbox Code Playgroud)
或者这个(Control.Monad.Trans.Identity):
MonadTrans (IdentityT *)
Run Code Online (Sandbox Code Playgroud)
这种签名究竟意味着什么呢?它没有出现在源代码中,但我已经注意到它似乎发生在使用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的错误或错误,因为据我所知,没有相同的源代码模拟.令人困惑的是,我不知道一种更好的理解方式,而不是认识它通常表现出来的方式,并从视觉上推断出从背景中发生的事情.