浏览各种软件包的haddocks我经常会看到这样的实例文档(Control.Category):
Category k (Coercion k)
Category * (->)
或此(Control.Monad.Trans.Identity):
MonadTrans (IdentityT *)
这种签名究竟意味着什么?它没有出现在源代码中,但我已经注意到它似乎发生在使用 PolyKinds 扩展的模块中。我怀疑它可能像TypeApplication但有一种类型。所以,例如最后一个例子意味着IdentityT
是一个monad变换器,如果它的第一个参数有类*
。
所以我的问题是:
Category
实例中,我怎么知道k
是一种而不是一种类型?或者我只需要知道Category
我不是要求各种解释。
答案 0 :(得分:5)
To quote Richard Eisenberg’s recent post on the haskell-cafe mailing list:
Haddock有时会在启用
-XPolyKinds
时渲染类型。问题是GHC通常不需要编写类型的参数,也不会打印它们(除非你说-fprint-explicit-kinds
)。但我相信Haddock会在-XPolyKinds
开启时打印出类型。所以两个不同的定义实际上是相同的:它只是一个模块有-XPolyKinds
而另一个没有。{/ p>
*
是普通类型。因此,Int
有*
种(我们写Int :: *
),而Maybe
有种* -> *
。Typeable
实际上有forall k. k -> Constraint
种,意味着它是多边形的。在下面的第一个代码段中,*
的{{1}}参数使用Typeable
实例化k
,因为类型变量a具有*
种类。
是的,正如您猜测的那样,它与*
有关。 Haddock使用一种“显式类应用程序”呈现这些多边形类型。恰好PolyKinds
是多边形的,具有Category
种,所以Haddock在每个实例旁边呈现类型的应用程序。
在我看来,这是Haddock的错误或错误,因为据我所知,没有等效的源代码模拟。令人困惑的是,我不知道更好的理解方法,而不是认识它通常表现的方式,并从视觉上推断出背景中发生的事情。