2012-07-11 4 views
122

推測型の「許容可能な複雑さ」にはどのような制限がありますか? <a href="http://www.scala-lang.org/docu/files/ScalaReference.pdf#page58" rel="noreferrer">Scala Language Spec</a>によれば

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

実際にはどのような制限がありますか?

また、推定される表現型に適用される制限は、パラメータ型の境界よりも制限がありますか?

+2

[このブログ](http://pchiusano.blogspot.com/2011/05/making-most-of-scalas-extremely-limited.html)は、このトピックに関するいくつかの興味深い議論を持っています – Jamil

+0

はい、それは1つの種類スカラーが推論することを拒否する型の部分的に適用される型コンストラクタ。私は他人がいるのだろうかと思う。 – Owen

+20

ここに記載されたスカラー言語のメーリングリストに投稿することをお勧めします:http://www.scala-lang.org/node/199 – david

答えて

10

型を推測するとき、コンパイラは多くの場合、型リストの最小Upper Bound(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は、そのような推論された型の深さを制限するために、いくつかの健全性チェックを導入しました。

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

関連する問題