【问题标题】:Why is `forall` required to have a polymorphic type in data definition?为什么要求“forall”在数据定义中具有多态类型?
【发布时间】: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


【解决方案1】:

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 的需求量身定制的,类似的类型在其他情况下也很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    相关资源
    最近更新 更多