web-dev-qa-db-ja.com

scalaは、推論された型の「許容できる複雑さ」にどのような制限を課しますか?

Scala言語仕様 によると:

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

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

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

121
Owen

型を推測する場合、コンパイラーは多くの場合、型のリストの最小上限(LUB)を計算する必要があります。たとえば、if (cond) e1 else e1のタイプは、e1および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]...

この commit は、そのような推測されたタイプの深さを制限するためにいくつかのサニティチェックを導入しました。

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

10
retronym