在本文中,有一个具有以下签名的函数:
vreplicate :: forall a n . SNatI n => a -> Vec a n
Run Code Online (Sandbox Code Playgroud)
这个签名和没有签名的签名有什么区别forall
:
vreplicate :: SNatI n => a -> Vec a n
Run Code Online (Sandbox Code Playgroud)
?我的印象是,没有forall
,它隐含地意味着forall
在前面命名所有类型变量.
Dan*_*ner 10
有两个重要的案例,包括一个forall
有所作为.第一个是a的位置forall
可以改变一个类型的含义 - 如果它出现在箭头的左边,这意味着函数的参数比其他情况"更多态".这种差异是一个基本的差异; 但是,它似乎并不适用于此.
第二个区别是句法(而不是基本),即:在存在的情况下ScopedTypeVariables
,由forall
打开的打字范围绑定的变量,而变量隐式绑定而forall
不是.因此,在体内vreplicate
,可以使用类型变量a
,n
并且可以确定它们指的是签名中提到的相同类型vreplicate
.没有forall
(或没有ScopedTypeVariables
),使用a
和n
在体内vreplicate
将引入新的普遍量化的变量,并且程序员有责任确保它们与签名中的类型统一(vreplicate
如果是期望的话).更多详细信息可在文档中找到.
如果没有仔细阅读本文,我无法确定,但我强烈打赌后者正在这里发生.