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
中的s
是Type
kind-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.
找到关于它的很好的解释
在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
中的s
是Type
kind-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.
找到关于它的很好的解释