为什么`forall`需要在数据定义中具有多态类型?

时间:2015-09-15 14:42:56

标签: haskell polymorphism parametric-polymorphism

似乎我需要明确说forall在数据定义中有参数类型。例如,这个

data A = A (forall s. ST s (STUArray s Int Int))

将在此

时工作
data A = A (ST s (STUArray s Int Int))

赢得'吨

也许我会问一些太明显的事情,但我之所以不清楚这一点,因为在大多数其他情况下,您不需要明确的forall来指定参数类型;编译器会这样做。那么这里的区别是什么?

1 个答案:

答案 0 :(得分:7)

forall有两个不同的地方,其中只有一个是你想要的。另一个是

data A = forall s . A (ST s (STUArray s Int Int))

这相当于GADT语法

data A where
  A :: ST s (STUArray s Int Int) -> A

这可以被认为是一个包含ST状态转换器的框,其中有一些s或其他完全没用。但是类型检查器并不是专门针对ST的需求而定制的,类似的类型在其他环境中也很有用。