曾经有人向我展示了SML中的一个小技巧,他们在REPL中编写了大约3或4个函数,最后一个值的结果类型非常长(需要很多页才能滚动完)。
是否有人知道生成这种长类型的代码,或者是否有一个名称来描述这种行为?
曾经有人向我展示了SML中的一个小技巧,他们在REPL中编写了大约3或4个函数,最后一个值的结果类型非常长(需要很多页才能滚动完)。
是否有人知道生成这种长类型的代码,或者是否有一个名称来描述这种行为?
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)