微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

所有人的亲切签名

如何解决所有人的亲切签名

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中类型变量s :: Type的提升类型与s中类型变量(s ~> Type) -> Type统一,但是会发生什么吗?我觉得我缺少一些非常基本的东西。

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

解决方法

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

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

Sigma的声明中,

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

s :: TypeType种类的种类变量,当您使用Sigma时必须显式传递该种类。并以亲切的签名

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

forall s表示s是可见的种类。这意味着您需要在其可见时明确传递它。您可以将其读为Sigma是一个类型构造器,它接受类型s和类型s ~> Type,并返回类型Type

您不能直接在GHC 8.8.4中编写此类型签名,但可以在GHC 8.10.1中使用StandaloneKindSignatures来编写。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。