forall 亲切的签名

forall in a kind signature

singletons-2.6, Sigma中定义为

data Sigma (s :: Type) :: (s ~> Type) -> Type

而 GHC 8.8.4 表明它的种类是

> :k Sigma
Sigma :: forall s -> (s ~> *) -> *

那么这种签名中的forall是什么?

显然不同于

data Sigma :: forall s. Type -> (s ~> Type) -> Type

在这种情况下,它的种类当然是

Sigma :: * -> (s ~> *) -> *

另外,好像和

不一样
data Sigma :: f s -> (s ~> *) -> *

在我看来,s :: Type中的类型变量s的提升种类与(s ~> Type) -> Type中的种类变量s是统一的,但它做了什么发生?我觉得我缺少一些非常基本的东西。

我试图找到任何描述这个的文件,但我没有运气。

现在,我从 GHC Wiki 中的 dependent haskell 得到了一些想法。

我们现在可以将类型传递给类型构造函数,就像我们可以将类型传递给数据构造函数一样(尽管我们仍然需要传递单例而不是类型本身)。

Sigma 的声明中,

data Sigma (s :: Type) :: (s ~> Type) -> Type
s :: Type中的

sTypekind-kind的一种变量,使用Sigma时必须显式传递这种变量。并在其实物签名中,

Sigma :: forall s -> (s ~> *) -> *

forall s表示s是可见的种类。这意味着当您说它可见时,您需要显式传递它。您可以将其理解为 Sigma 是一个类型构造函数,它接受一种类型 s 和一种类型 s ~> Type,并返回一种类型 Type.

在GHC 8.8.4中不能直接写这个类型签名,但是在GHC 8.10.1中可以用StandaloneKindSignatures写。

更新 (2021/9/30):

这叫做可见相关量化。您可以在 Visible dependent quantification in Haskell.

找到关于它的很好的解释