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

时间:2012-07-11 04:03:04

标签: scala type-inference

根据Scala Language Spec

  

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

在实践中有什么限制?

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

1 个答案:

答案 0 :(得分:10)

在推断类型时,编译器通常需要计算类型列表的最小上限(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]...

commit引入了一些健全性检查来限制此类推断类型的深度。

最近有一些工作要插入编译过程以检测需要很长时间计算的推断类型,并建议显式类型注释可能是谨慎的位置。