在此paper中,具有以下签名的函数:

vreplicate :: forall a n . SNatI n => a -> Vec a n

此签名与没有forall的签名有什么区别:
vreplicate :: SNatI n => a -> Vec a n

?我的印象是,没有forall,它的隐含含义与前面命名所有类型变量的forall相同。

最佳答案

在两种重要情况下,包括forall会有所不同。首先是forall的位置可以改变类型的含义-如果它位于箭头的左侧,则意味着该函数的自变量比其他情况“具有更多的多态性”。这种差异是根本的差异;但是,它似乎在这里并不适用。

第二个区别是语法上的(而不是基本的),即:在存在ScopedTypeVariables的情况下,由forall绑定(bind)的变量打开了键入范围,而没有forall的隐式绑定(bind)的变量则没有。因此,在vreplicate主体中,可以使用类型变量an,并确保它们引用的类型与vreplicate签名中提到的类型相同。如果没有forall(或没有ScopedTypeVariables),则在a主体中使用nvreplicate会引入新鲜的,通用量化的变量,并且程序员有责任确保它们与vreplicate签名中的类型统一。想要的。进一步的细节可以在the documentation中找到。

如果不能仔细阅读本文,则不能确定,但​​是我坚信后者正在这里发生。

关于haskell - 了解两个Haskell签名之间的区别,其中一个使用forall,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33576722/

10-12 00:34