Scalaの型推論はグローバルではないことを読みました。そのため、人々はメソッドに型アノテーションを配置する必要があります。(これは「ローカル」型推論でしょうか?)
その理由がオブジェクト指向の性質にあることを私は少しだけ理解していますが、明快さは私にはわかりません。「グローバル型推論」についての説明はありますか?また、Scalaが初心者が理解できるようにそれを理解できないのはなぜですか?
Scalaの型推論はグローバルではないことを読みました。そのため、人々はメソッドに型アノテーションを配置する必要があります。(これは「ローカル」型推論でしょうか?)
その理由がオブジェクト指向の性質にあることを私は少しだけ理解していますが、明快さは私にはわかりません。「グローバル型推論」についての説明はありますか?また、Scalaが初心者が理解できるようにそれを理解できないのはなぜですか?
問題は、HM型推論は、サブタイピング、オーバーロード、または同様の機能を備えた言語では一般に決定不可能であるということです。Refこれは、より多くのものを推論器に追加して、より特殊なケースを推論させることができることを意味しますが、失敗するコードは常に存在します。
Scalaは、メソッド引数やその他の場所で型アノテーションを必須にすることを決定しました。これは最初は面倒に思えるかもしれませんが、これはコードの文書化に役立ち、コンパイラーが1か所で理解できる情報を提供することを考慮してください。さらに、HM推論を使用する言語では、HMアルゴリズムが実行され、(偶然に)コードの他の部分を誤ったタイプで推論したため、プログラミングエラーが元の間違いから遠く離れたコードで検出されることがあるという問題が発生することがよくあります。失敗する前に推測しました。
Scalaの推論は、基本的に外側(メソッド定義)から内側(メソッド内のコード)まで機能するため、間違った型アノテーションの影響を制限します。
HM推論を使用する言語は、内部から外部へと機能します(型注釈を追加する可能性を無視します)。つまり、1つのメソッドで小さなコードを変更すると、プログラム全体の意味が変わる可能性があります。これは良いことも悪いこともあります。
グローバル型推論の典型的な例は、Hindley-Milnerです。特定のプログラムを使用して、必要なすべての型を「計算」します。ただし、これを実現するには、特定の言語にいくつかのプロパティが必要です(HMには、これらの制限のいくつかを克服しようとする拡張機能があります)。HMが気に入らないのは、継承とメソッドのオーバーロードの2つです。私が理解している限り、これらはScalaがHMまたはその変形を採用するための主な障害です。実際には、HMに大きく依存している言語でさえ、100%の推論に達することはないことに注意してください。たとえば、Haskellでも、時々型注釈が必要になります。
そのため、Scalaはより限定された(「ローカル」と言うように)型推論の形式を使用しますが、それでも何もないよりはましです。私が知る限り、Scalaチームは、可能な場合はリリースごとに型推論を改善しようとしていますが、これまでのところ、小さなステップしか見ていません。HMスタイルの型推論器とのギャップはまだ大きく、完全に埋めることはできません。