1. ホーム
  2. scala

[解決済み] scalaは推論される型の「許容される複雑さ」にどのような制限を設けているのでしょうか?

2022-09-13 02:24:07

質問

によると Scala 言語仕様 :

<ブロッククオート

...局所的な型推論は、[型パラメータの]推論される境界の複雑さを制限するために許可されています。 の複雑さを制限するために許可されています。型の最小性と最大性は、許容される複雑さの型の集合に相対的に理解されなければならない 許容される複雑さを持つ型の集合に関連して理解されなければならない。

実際にはどのような限界があるのでしょうか?

また、推論された式の型に適用される制限は、パラメータの型の境界とは異なるのでしょうか、またその制限はどのようなものでしょうか。

どのように解決するのですか?

型を推論する際、コンパイラはしばしば型のリストのLeast Upper Bound (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]...

これは コミット は、そのような推論される型の深さを制限するために、いくつかのサニティチェックを導入しました。

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