SCALAに関して「グローバルタイプの推論はありません」とはどういう意味ですか?

StackOverflow https://stackoverflow.com/questions/4304003

質問

Scalaのタイプの推論はグローバルではないので、人々はメソッドにタイプの注釈を置かなければならない理由です。 (これは「ローカル」タイプの推論でしょうか?)

その理由はそのオブジェクト指向の性質からであることを少し理解していますが、明確さは私を避けています。 「グローバルタイプの推論」の説明はありますか?また、なぜSCALAが初心者が理解しているかもしれないそれを持っていないのですか?

役に立ちましたか?

解決

グローバルタイプの推論の典型的な例は次のとおりです Hindley-Milner: :特定のプログラムを取り、必要なすべてのタイプを「計算」します。ただし、これを達成するには、特定の言語にはいくつかのプロパティが必要です(HMへの拡張があり、これらの制限のいくつかを克服しようとします)。 HMが気に入らない2つのことは、継承とメソッドの過負荷です。私が理解する限り、これらはScalaがHMまたはそのバリアントを採用する主な障害です。実際には、HMに大きく依存している言語でさえ、100%の推論に到達することは決してないことに注意してください。

したがって、Scalaは、より限定的な(「ローカル」と言うように)タイプ推論を使用しますが、これはまだ何よりも優れています。私が知る限り、SCALAチームは、可能なときにリリースからリリースまでのタイプの推論を改善しようとしますが、これまでのところ、私は小さなステップしか見ていません。 HMスタイルタイプの推測者とのギャップは依然として巨大であり、完全に閉じることはできません。

他のヒント

問題は、HMタイプの推論が、サブタイピング、過負荷、または同様の機能を備えた言語では一般に決定不可能であることです。ref これは、より多くのものを推測者に追加して、より多くの特別なケースを推測できることを意味しますが、それが失敗する場所は常にあります。

Scalaは、メソッド引数でタイプの注釈を作成し、その他のいくつかの場所を必須にすることを決定しました。これは最初に手間のように思えるかもしれませんが、これはコードを文書化するのに役立ち、コンパイラに1つの場所で理解できる情報を提供することを考慮してください。さらに、HMアルゴリズムが順調に進んで(偶然)故障したタイプのコードの他の部分を推測するために(偶然)起こったため、HM推論を持つ言語はプログラミングエラーが元の間違いから遠く離れたコードで時々検出されることがあるという問題に苦しむことがよくあります。失敗する前に推測されました。

Scalaの推論は基本的に外部(メソッド定義)から内部(メソッド内のコード)に機能するため、間違ったタイプの注釈の影響を制限します。

HM推論を持つ言語は、内側から外側に動作します(タイプの注釈を追加する可能性を無視します)。つまり、1つの方法で小さなコード変更がプログラム全体の意味を変更できる可能性があります。これは良いことも悪いこともあります。


参照: Lower bounds on type inference with subtypes

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top