[解決済み] scalaは推論される型の「許容される複雑さ」にどのような制限を設けているのでしょうか?
2022-09-13 02:24:07
質問
によると Scala 言語仕様 :
<ブロッククオート...局所的な型推論は、[型パラメータの]推論される境界の複雑さを制限するために許可されています。 の複雑さを制限するために許可されています。型の最小性と最大性は、許容される複雑さの型の集合に相対的に理解されなければならない 許容される複雑さを持つ型の集合に関連して理解されなければならない。
実際にはどのような限界があるのでしょうか?
また、推論された式の型に適用される制限は、パラメータの型の境界とは異なるのでしょうか、またその制限はどのようなものでしょうか。
どのように解決するのですか?
型を推論する際、コンパイラはしばしば型のリストのLeast Upper Bound (LUB)を計算する必要があります。例えば、型が
if (cond) e1 else e1
の型の LUB は
e1
と
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]...
これは コミット は、そのような推論される型の深さを制限するために、いくつかのサニティチェックを導入しました。
計算するのに長い時間がかかる推論された型を検出し、明示的な型注釈が賢明であるかもしれない場所を示唆するために、コンパイルプロセスにプラグインする最近の作業がありました。
関連
-
[解決済み] self-typesとtrait subclassの違いは何ですか?
-
[解決済み] Scalaのapply関数とは何ですか?
-
[解決済み] 述語で配列を2つに分割するには?
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] 依存するメソッドタイプの説得力のある使用例とは?
-
[解決済み] Scalaでは、'val a. = _' (アンダースコア)は具体的にどのような意味ですか?A = _' (アンダースコア)とはどういう意味ですか?
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] Scalaです。リスト[Future]からFuture[List]への変換は、失敗したFutureを無視する。
-
[解決済み] リスト[Option]からNoneを除外するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 述語で配列を2つに分割するには?
-
[解決済み] RDDの内容を印刷するには?
-
[解決済み] IntelliJ IDEAで依存関係が変更された後、build.sbtから強制的に再ロードするには?
-
[解決済み] Scalaでは、'val a. = _' (アンダースコア)は具体的にどのような意味ですか?A = _' (アンダースコア)とはどういう意味ですか?
-
[解決済み] ネストした構造体をよりきれいに更新する方法
-
[解決済み] Scalaのforループは下降か減少か?
-
[解決済み] SBTが終了せずに実行を停止する
-
[解決済み] Scalaのパターンマッチはなぜ変数で機能しないのですか?
-
[解決済み] Scalaの配列の初期化
-
[解決済み] 単純な case class の順序を定義する簡単な慣用的方法