理解两个Haskell签名之间的区别,一个使用forall

Ana*_*Ana 6 haskell

本文中,有一个具有以下签名的函数:

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),使用an在体内vreplicate将引入新的普遍量化的变量,并且程序员有责任确保它们与签名中的类型统一(vreplicate如果是期望的话).更多详细信息可在文档中找到.

如果没有仔细阅读本文,我无法确定,但我强烈打赌后者正在这里发生.