120

Scala言語仕様によると:

...ローカル型推論は、[型パラメーターの]推論された境界の複雑さを制限するために許可されています。タイプの最小性と最大性は、許容できる複雑さのタイプのセットに関連して理解する必要があります。

実際には、制限は何ですか?

また、推定式タイプとパラメータータイプの境界に適用される制限はありますか?また、それらの制限は何ですか?

4

1 に答える 1

10

タイプを推測する場合、コンパイラーはタイプのリストの最小上限(LUB)を計算する必要があることがよくあります。たとえば、のタイプはとif (cond) e1 else e1のタイプのLUBです。e1e1

これらのタイプは非常に大きくなる可能性があります。たとえば、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]...

このコミットは、そのような推測されたタイプの深さを制限するためにいくつかの健全性チェックを導入しました。

計算に長い時間がかかる推論された型を検出し、明示的な型注釈が賢明である可能性がある場所を提案するために、コンパイルプロセスにプラグインする最近の作業がいくつかあります。

于 2013-02-04T12:38:27.160 に答える