scala对推断types的“可接受的复杂性”有何限制?
根据斯卡拉语言规范 :
…允许局部types推断来限制[types参数]的推断界限的复杂性。 types的最小性和最大性必须相对于可接受复杂性types的集合来理解。
在实践中有什么限制?
此外,是否有不同的限制,适用于推断expression式types比参数types界限,这些限制是什么?
在推断types时,编译器经常需要计算types列表的最小上限(LUB)。 例如, if (cond) e1 else e1
的types是e1
和e1
types的LUB。
这些types可以变得相当大,例如在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]...
这个提交引入了一些理智检查来限制这种推断types的深度。
最近有一些工作要插入到编译过程中来检测需要很长时间计算的推断types,并build议明确的types注释可能是谨慎的地方。