标量对推断类型的“可接受的复杂性”有什么限制?


120

根据Scala语言规范

...允许使用局部类型推断来限制[类型参数]推断范围的复杂性。必须相对于可接受的复杂性类型集合来理解类型的最小和最大。

在实践中有什么限制?

另外,适用于推断表达式类型的限制与适用于参数类型界限的限制是否不同,这些限制是什么?


2
这个博客对此主题进行了一些有趣的讨论
Jamil

20
我建议将其张贴到此处提到的scala语言邮件列表中:scala-lang.org/node/199
Dave L.

1
我不确定,但是我认为这意味着,例如,我们有一个字符串列表,并且添加了一个int值。返回的不可变列表最终的类型为“任何”。因此类型的最大性
Jatin

8
实际上,这是一个移动的目标,因为不同版本的Scala编译器具有不同的限制。这种情况已经改变,并且随着语言的不断发展,我希望至少在短期内会继续改变。我否决了这个问题,因为按照目前的说法无法回答。
Kevin Sitze

1
@kevin确实如此。我想我对scala 2.9最感兴趣,因为它是最近的但很稳定。但我想知道会有什么改变。
欧文(Owen)

Answers:


10

推断类型时,编译器通常需要计算类型列表的最小上界(LUB)。例如,类型if (cond) e1 else e1为类型的LUB e1e1

这些类型可能会变得很大,例如,在REPL中尝试以下操作:

:type Map(1 -> (1 to 10), 2 -> (1 to 10).toList)
scala.collection.immutable.Map[Int,scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int] with Serializable{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def takeRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def drop(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def take(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]}; def dropRight(n: Int): scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]{def reverse: scala.collection.immutable.Seq[Int] with scala.collection.AbstractSeq[Int]; def dropRight(n: Int): scala.collection.immutable.Seq[Int]...

提交引入了一些健全性检查,以限制此类推断类型的深度。

最近有一些工作可以插入到编译过程中,以检测需要很长时间才能计算出的推断类型,并建议可能需要谨慎使用显式类型注释的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.