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


120

Scala言語仕様によると:

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

実際には限界は何ですか?

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


2
このブログには、このトピックに関する興味深いディスカッションがあります
Jamil

20
ここに記載されているscala-languageメーリングリストに投稿することをお勧めします:scala-lang.org/node/199
Dave L.

1
確かではありませんが、たとえば、文字列のリストがあり、それにintを追加していることを意味します。返される不変のリストは、最終的にはタイプ「Any」です。型の最大性
Jatin

8
Scalaコンパイラの異なるバージョンには異なる制限があるため、これは実際には動くターゲットです。これは変更されており、言語が発展し続けるので、少なくとも近い将来に変更され続けると思います。現在述べられているように答えられないので、私はこの質問に投票します。
Kevin Sitze

1
@kevin確かにそうです。Scala 2.9は、最近ではあるが安定しているので、最も興味があると思います。でもどれだけ変わるのかな。
オーウェン

回答:


10

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.