黑线鳕

时间:2017-01-21 10:23:16

标签: haskell haddock type-kinds polykinds

浏览各种软件包的haddocks我经常会看到这样的实例文​​档(Control.Category):

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

或此(Control.Monad.Trans.Identity):

MonadTrans (IdentityT *)

这种签名究竟意味着什么?它没有出现在源代码中,但我已经注意到它似乎发生在使用 PolyKinds 扩展的模块中。我怀疑它可能像TypeApplication但有一种类型。所以,例如最后一个例子意味着IdentityT是一个monad变换器,如果它的第一个参数有类*

所以我的问题是:

  • 我的解释是否正确,签名所指的是什么?
  • 在第一个Category实例中,我怎么知道k是一种而不是一种类型?或者我只需要知道Category
  • 的精神
  • 这种语法的源代码是什么?

我不是要求各种解释。

1 个答案:

答案 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的错误或错误,因为据我所知,没有等效的源代码模拟。令人困惑的是,我不知道更好的理解方法,而不是认识它通常表现的方式,并从视觉上推断出背景中发生的事情。