为什么 `forall` 在数据定义中需要多态类型?
Why is `forall` required to have a polymorphic type in data definition?
看来我需要明确地说 forall
才能在数据定义中具有参数类型。例如,这个
data A = A (forall s. ST s (STUArray s Int Int))
将在此
期间工作
data A = A (ST s (STUArray s Int Int))
不会。
也许我问的问题太明显了,但我不清楚其中的原因,因为在大多数其他情况下,您不需要显式 forall
来指定参数类型;编译器代替它。那么这里有什么区别呢?
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
的需求量身定制的,类似的类型在其他情况下也很有用。
看来我需要明确地说 forall
才能在数据定义中具有参数类型。例如,这个
data A = A (forall s. ST s (STUArray s Int Int))
将在此
期间工作data A = A (ST s (STUArray s Int Int))
不会。
也许我问的问题太明显了,但我不清楚其中的原因,因为在大多数其他情况下,您不需要显式 forall
来指定参数类型;编译器代替它。那么这里有什么区别呢?
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
的需求量身定制的,类似的类型在其他情况下也很有用。