[英]Understanding the difference between two Haskell signatures, one using forall
在本文中,有一个具有以下签名的函数:
vreplicate :: forall a n . SNatI n => a -> Vec a n
这个签名和没有forall
签名有什么区别:
vreplicate :: SNatI n => a -> Vec a n
? 我的印象是,没有forall
,它隐含意味着与前面的forall
相同,它命名所有类型变量。
有两个重要的案例,其中包括forall
。 第一个是forall
的位置可以改变一个类型的含义 - 如果它出现在箭头的左边,这意味着函数的参数比其他情况“更多态”。 这种差异是一个基本的差异; 但是,它似乎并不适用于此。
第二个区别是语法(而不是基本),即:在存在ScopedTypeVariables
的情况下,由forall
绑定的变量打开一个打字范围,而没有forall
隐式绑定的变量则不会。 因此,在vreplicate
的主体中,可以使用类型变量a
和n
并确保它们引用与vreplicate
的签名中提到的相同类型。 如果没有forall
(或没有ScopedTypeVariables
),在vreplicate
主体中使用a
和n
会引入新的通用量化变量,并且程序员有责任确保它们与vreplicate
签名中的类型统一,如果这是期望。 更多详细信息可在文档中找到 。
如果没有仔细阅读本文,我无法确定,但我强烈打赌后者正在这里发生。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.