Functional programming 使用Hindley-Milner类型推断在SML中增长类型定义

Functional programming 使用Hindley-Milner类型推断在SML中增长类型定义,functional-programming,sml,type-inference,ml,hindley-milner,Functional Programming,Sml,Type Inference,Ml,Hindley Milner,有人曾经向我展示了SML中的一个小技巧,他们在REPL中写出了大约3或4个函数,最后一个值的结果类型非常长(就像许多页面滚动条一样长) 有没有人知道是什么代码生成了这么长的类型,或者这种行为是否有名称 如果以正确的方式组合,由Hindley/Milner类型推理推断出的类型可以成倍地大。例如: fun f x = (x, x, x) val t = f (f (f (f (f 0)))) 这里,t是一个嵌套的三元组,其嵌套深度对应于f的调用次数n。因此,整个类型的大小为3^n 然而,这实际上并

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


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

如果以正确的方式组合,由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式的类型推断是最坏情况下的指数(在空间和时间上)。然而,值得指出的是,指数情况只能发生在类型变得指数大的情况下——也就是说,如果没有类型推断,你甚至无法真实地表达出来。

没错,但在这种情况下,推理系统的最坏情况复杂性会被显示出来,结果类型会跨越许多页卷轴。。只是想知道如何重新创建它。在问题中包括“多页卷轴”——这是一个不同于我想象的“长”的版本。不仅对如何创建它,而且更重要的是对为什么会出现这种情况的精彩解释。非常感谢你!