如何解决所有人的亲切签名
在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 :: Type
是Type
种类的种类变量,当您使用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 举报,一经查实,本站将立刻删除。