4

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

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

将工作,而这

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

惯于。

也许我问的东西太明显了,但是我不清楚原因是因为在大多数其他情况下,您不需要显式forall指定参数类型;编译器代替它。那么这里有什么区别呢?

4

1 回答 1

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.

于 2015-09-15T16:20:12.090 回答