【问题标题】:Growth of Type Definition in SML Using Hindley Milner Type Inference使用 Hindley Milner 类型推断的 SML 中类型定义的增长
【发布时间】:2014-03-30 09:57:07
【问题描述】:

有人曾经向我展示了 SML 中的一个小“技巧”​​,他们在他们的 REPL 中写了大约 3 或 4 个函数,最后一个值的结果类型非常长(就像许多页面滚动一样长)。

有谁知道是什么代码生成了这么长的类型,或者这种行为是否有名称?

【问题讨论】:

  • 对,但在这种特定情况下,推理系统的最坏情况复杂性被展示出来,并且生成的类型跨越了许多页面滚动。只是好奇如何重新创建它。
  • 在问题中包含“许多页面滚动” - 这是与我想象的不同版本的“长”。

标签: functional-programming sml type-inference ml hindley-milner


【解决方案1】:

如果您以正确的方式组合它们,则由 Hindley/Milner 类型推断推断出的类型可能会成倍增长。例如:

fun f x = (x, x, x)
val t = f (f (f (f (f 0))))

这里,t 是一个嵌套三元组,其嵌套深度对应于f 的调用次数n。因此,整个类型的大小为 3^n。

然而,这实际上并不是最坏的情况,因为该类型具有规则结构,并且可以在线性空间中有效地用图表示(因为在每个级别上,所有三个组成类型都是相同的并且可以共享)。

真正最坏的情况是使用多态实例化来解决这个问题:

fun f x y z = (x, y, z)
val p1 = (f, f, f)
val p2 = (p1, p1, p1)
val p3 = (p2, p2, p2)

在这种情况下,类型再次呈指数增长,但与上述不同的是,所有组成类型都是不同的新类型变量,因此即使是图形表示也呈指数增长(在 pN 声明的数量上)。

所以是的,Hindley/Milner 风格的类型推断是最坏情况下的指数(在空间和时间上)。然而,值得指出的是,指数情况只会发生在类型以指数方式变大的情况下——即在没有类型推断的情况下你甚至无法实际表达的情况。

【讨论】:

  • 很棒的解释,不仅是如何做到这一点,更重要的是为什么会发生这种情况。非常感谢!
猜你喜欢
  • 2023-03-25
  • 2013-03-07
  • 1970-01-01
  • 2012-11-24
  • 2014-07-22
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多