Haskell *(星)或其他种类在黑线鳕实例列表中的含义是什么

Haskell *(星)或其他种类在黑线鳕实例列表中的含义是什么,haskell,haddock,type-kinds,polykinds,Haskell,Haddock,Type Kinds,Polykinds,浏览各种软件包的haddock时,我经常会看到如下()所示的实例文档: 或者这个(): 这种签名到底是什么意思?它没有出现在源代码中,但我已经注意到,它似乎出现在使用PolyTypes扩展的模块中。我怀疑它可能像一个打字应用程序,但有一种。例如,最后一个示例意味着IdentityT是一个monad转换器,如果它的第一个参数具有kind* 因此,我的问题是: 我的解释正确吗?实物签名指的是什么 在第一个Category实例中,我怎么知道k是一种而不是一种类型?还是我只需要知道类别的算术 与此语法

浏览各种软件包的haddock时,我经常会看到如下()所示的实例文档:

或者这个():

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

因此,我的问题是:

  • 我的解释正确吗?实物签名指的是什么
  • 在第一个
    Category
    实例中,我怎么知道
    k
    是一种而不是一种类型?还是我只需要知道
    类别的算术
  • 与此语法类似的源代码是什么
我不是要你解释这些种类。

:

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

*
是一种普通类型。所以
Int
有种类
*
(我们写
Int:*
),而
可能有种类
*->*
Typeable
实际上对所有k都有种类
。k->Constraint
,表示它是多类的。在下面的第一个代码段中,
Typeable
*
参数用
*
实例化了
k
,因为类型变量a具有种类
*

所以,是的,正如你所猜测的,它与
多种类物种有关。Haddock使用一种“显式种类应用程序”呈现这些多种类类型。恰巧,
Category
是多类的,所有k都有
类。(k->k->*)->Constraint
,因此Haddock在每个实例旁边呈现同类应用程序

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

:

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

*
是一种普通类型。所以
Int
有种类
*
(我们写
Int:*
),而
可能有种类
*->*
Typeable
实际上对所有k都有种类
。k->Constraint
,表示它是多类的。在下面的第一个代码段中,
Typeable
*
参数用
*
实例化了
k
,因为类型变量a具有种类
*

所以,是的,正如你所猜测的,它与
多种类物种有关。Haddock使用一种“显式种类应用程序”呈现这些多种类类型。恰巧,
Category
是多类的,所有k都有
类。(k->k->*)->Constraint
,因此Haddock在每个实例旁边呈现同类应用程序


在我看来,这是Haddock的一个bug或是一个错误,因为据我所知,没有等效的模拟源代码。这是令人困惑的,我不知道有什么更好的方法来理解它,而不是认识到它通常表现的方式,并从视觉上推断出正在发生的事情。

同意,我也认为这是一个错误。也许使用
Category@k(强制k)
是一种更好的表示法。在某些情况下,它需要指定类型中不存在的类型变量的类型。这种组合使得很难找到一种明智的方法。同意,我也认为这是一个错误。也许使用
Category@k(强制k)
是一种更好的表示法。在某些情况下,它需要指定类型中不存在的类型变量的类型。这种结合使得很难找到一种合理的记录方式。
Category k (Coercion k)
Category * (->)
MonadTrans (IdentityT *)