【发布时间】:2015-09-15 14:42:56
【问题描述】:
看来我需要明确地说forall 才能在数据定义中具有参数类型。比如这个
data A = A (forall s. ST s (STUArray s Int Int))
将在此期间工作
data A = A (ST s (STUArray s Int Int))
不会。
也许我问的问题太明显了,但我不清楚原因,因为在大多数其他情况下,您不需要显式的 forall 来指定参数类型;编译器代替它。那么这里有什么区别呢?
【问题讨论】:
-
见this答案
-
当它是顶级声明时,编译器会推断出隐含的
forall,但这是唯一一次。 -
好吧,因为如果您写:
data A = A a,您可能只是忘记添加类型参数:data A a = A a。事实上,我认为这是最常见的情况,因此需要明确的forall可以消除歧义并避免错误。 -
@LouisWasserman,也用于类成员声明、GADT 构造函数声明以及
let泛化的结果。 -
和
let有明确的签名,我也应该说。
标签: haskell polymorphism parametric-polymorphism