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

标签 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指定参数类型;编译器改为这样做。那么这里有什么区别呢?

最佳答案

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 的需要而定制的。 , 和类似的类型在其他上下文中很有用。

关于haskell - 为什么 `forall` 需要在数据定义中具有多态类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32588983/

相关文章:

haskell - 为什么常数返回得更快?

Haskell 包版本控制策略 - 依赖项的变化

C++:当不是所有的派生类都预先知道时使用继承?

javascript - javascript中的多级多态,多态Object.extend

c++ - 使用C++制作泛型——共享实现的模板

pointers - 为什么带有多态 Ptr 的 `peek` 在与绑定(bind)一起使用时会返回 GHC.Prim.Any?

haskell - 如何在 haskell 中验证 OpenSSH 签名?

haskell - 快照 : wrapping auth handler with CSRF checker

java - 作为子类的动态类型转换

hibernate - 多态 'get' 使用 hibernate、多对一、InheritanceType.JOINED