Scala 对推断类型的“可接受复杂性”设置了什么限制?

根据 Scala 语言规范:

局部类型推断可以限制推断的复杂性 bounds [of type parameters]. Minimality and maximality of types have to be understood 相对于可接受复杂性类型的集合。

在实践中,限制是什么?

此外,对于推断的表达式类型和参数类型界限,是否存在不同的限制? 这些限制是什么?

3418 次浏览

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

这些类型可以变得非常大,例如在 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]...

这个 承诺引入了一些健全性检查来限制这种推断类型的深度。

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