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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (14)

局部类型推断被允许限制推断界的复杂性。类型参数,类型的极小性和最大值必须相对于可接受的复杂性类型集合来理解。

在实践中,限制是什么?

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

提问于
用户回答回答于

当推断类型时,编译器通常需要计算类型列表的最小上界(Lub)。例如,if (cond) e1 else e1类型的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]...

最近在编译过程中进行了一些工作,用于检测需要很长时间才能计算的推断类型,并建议使用显式类型注释可能比较谨慎的地方。

扫码关注云+社区