タイプ推論とは何ですか?
歴史的に、型推論(またはタイプの再構成)は、プログラムで全てタイプが本質的に任意の明示的な型注釈を必要とせずに誘導することができることを意味します。しかし、近年では、プログラミング言語の主流において、「型推論」(例えば、C++ 11の新しいauto
宣言)として、ボトムアップ型の控除の最も些細な形態でさえも強調されている。だから、人々は "本当の"ものを参照するために "フル"を追加し始めている。
フルタイプ推論とは何ですか?
言語がどの程度推論できるかについての幅広いスペクトルがありますが、実際には、厳密な意味で「完全」型推論をサポートする言語はほとんどありません(コアMLは唯一の例です)。しかし、主な区別の要因は、それらに「定義」が添付されていないバインディングに対して型を導き出すことができるかどうかです。特に、関数のパラメータは—です。たとえば、
f(x) = x + 1
と書くことができます。 Int → Int型を持つ場合、この型推論を呼び出すことは理にかなっています。また、我々は、ときに約多型型推論を話し、例えば、
g(x) = x
はFORALLジェネリック型&が割り当てられ;(T)T →トン自動的。
型推論は単純型ラムダ計算の文脈で発明され、多型推論(別名Hindley/Milner型推論、1970年に発明された)は、MLファミリの言語、OCaml、そして間違いなくHaskell)。
フルタイプの推論の限界はありますか?
コアMLは、 "完全な"多形型推論の高級品です。しかし、それは型システムにおける多形性の特定の限界にかかっています。特に、関数の引数ではなく、定義だけを汎用にすることができます。それは定義がわかっている場合にid
が多型の種類を与えることができますので、
id(x) = x;
id(5);
id(True)
は、正常に動作しています。 id
は、関数の引数として多型にはできませんので、しかし
f(id) = (id(5); id(True))
は、MLにチェックを入力しません。言い換えれば、型システムは、<; t> t →のような多型を許しますが、多型の値が使われる(明白であるように、明示的に型指定された言語でさえ非常に少数ですら)。
明示的に型指定された多形ラムダ計算(「システムF」とも呼ばれる)は、後者を可能にする。しかし、完全なシステムFのタイプ再構成は決めることができないというタイプ理論の標準的な結果です。 Hindley/Milnerは、やや表現力の低いタイプのシステムのスイートスポットに当たるが、そのタイプの再構成は依然として決定可能である。
フルタイプの再構成が確定できなくなる高度なタイプのシステム機能があります。そして、それを決定可能に保ちながらもそれを実行不可能にする他のものがある。アドホックなオーバーロードまたはサブタイプの存在は、コンビナトリアルな爆発を招くためです。
PythonやPerlは気にしています。コンパイルされた言語ではありませんが、それはほとんど関係ありません。型推論ではDWIMを使用しない状況があります。私の経験上、Pythonは少し編集的であり、Perlは少し余裕があります。 – tripleee
pythonとperlは動的に型定義されたプログラミング言語です。型は*実行時*に値/変数にバインドされます。コンパイル時に型が設定されている言語については静的に型定義された完全型推定*言語 – fedvasu
http://en.wikipedia.org/wiki/Type_inferenceを読もうとしましたか?また、完全型推定は何を意味するのでしょうか? – Euphoric