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

120
根据《Scala语言规范》

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

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

2
这篇博客对这个主题进行了一些有趣的讨论。 - Jamil
20
我建议您发布到此处提到的scala语言邮件列表:http://www.scala-lang.org/node/199 - Dave L.
1
我不确定,但我认为它的意思是例如我们有一个字符串列表,并且我们正在将一个整数添加到其中。最终返回的不可变列表的类型为“Any”。因此,类型的极大化。 - Jatin
8
由于Scala编译器的不同版本具有不同的限制,因此这实际上是一个不断变化的目标。随着语言的不断发展,这种情况已经发生了变化,我预计在至少短期内将会继续改变。我对此问题进行了负投票,因为它无法按照当前陈述的方式回答。 - Kevin Sitze
1
@kevin 确实如此。我想我最感兴趣的是 Scala 2.9,因为它最近且稳定。但我想知道它会有多大的变化。 - Owen
显示剩余2条评论
1个回答

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]...

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

最近增加了一些工作流程来插件编译过程中以检测计算时间较长的推断类型,并建议在某些地方使用显式类型注释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接