6

浏览各种包的黑线鳕时,我经常看到类似这样的实例文​​档(Control.Category):

Category k (Coercion k)
Category * (->)

或者这个(Control.Monad.Trans.Identity):

MonadTrans (IdentityT *)

亲切的签名到底是什么意思?它没有出现在源代码中,但我已经注意到它似乎出现在使用PolyKinds扩展的模块中。我怀疑它可能就像一个 TypeApplication 但有一种。因此,例如最后一个示例意味着IdentityT如果它的第一个参数有 kind ,它就是一个 monad 转换器*

所以我的问题是:

  • 我的解释是否正确?善意的签名到底指的是什么?
  • 首先Category,我怎么知道这k是一种类型而不是类型?还是我只需要知道 arity 的数量Category
  • 与此语法类似的源代码是什么?

我不是要求对种类进行解释。

4

1 回答 1

5

引用 Richard Eisenberg 最近在 haskell-cafe 邮件列表上的帖子

Haddock 有时很难在-XPolyKinds启用的情况下渲染类型。问题是 GHC 通常不需要编写 kind 参数,也不会打印出来(除非你说-fprint-explicit-kinds)。但我相信,黑线鳕在任何时候都会打印出种类-XPolyKinds。所以这两种不同的定义实际上是一样的:只是一个模块有-XPolyKinds,另一个没有。

*是普通类型的那种。所以Int有 kind *(我们写Int :: *),而Maybe有 kind * -> *Typeable实际上有 kind forall k. k -> Constraint,这意味着它是多品种的。在下面的第一个片段中,实例化的*参数为,因为类型变量 a 具有 kind 。Typeablek**

所以是的,正如你猜到的,它与PolyKinds. Haddock 使用一种“显式类型应用程序”呈现这些多类型类型。碰巧它Category是多类的,有 kind forall k. (k -> k -> *) -> Constraint,所以 Haddock 在每个实例旁边呈现 kind 应用程序。

在我看来,这是 Haddock 的一个错误或错误功能,因为据我所知,没有等效的源代码模拟。它令人困惑,我不知道有什么比识别它通常表现的方式并从上下文中直观地推断出正在发生的事情更好的方式来理解它。

于 2017-01-21T10:35:56.337 回答