在此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
主体中,可以使用类型变量a
和n
,并确保它们引用的类型与vreplicate
签名中提到的类型相同。如果没有forall
(或没有ScopedTypeVariables
),则在a
主体中使用n
和vreplicate
会引入新鲜的,通用量化的变量,并且程序员有责任确保它们与vreplicate
签名中的类型统一。想要的。进一步的细节可以在the documentation中找到。
如果不能仔细阅读本文,则不能确定,但是我坚信后者正在这里发生。
关于haskell - 了解两个Haskell签名之间的区别,其中一个使用forall,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33576722/