5

次の関数定義で、ML はどのように型推論を実行しますか。

let add a b = a + b

テンプレートのインスタンス化の時点まで型チェックが実行されず、その後、型が必要な操作をサポートしている場合、関数が機能するか、コンパイルエラーがスローされる C++ テンプレートのようなものですか?

たとえば、次の関数テンプレート

template <typename NumType>
NumType add(NumType a, NumType b) {
  return a + b;
}

のために働きます

add<int>(23, 11);

しかし、うまくいきません

add<ostream>(cout, fout);

私が推測していることは正しいですか、それとも ML 型推論の動作が異なりますか?

PS: 拙い英語で申し訳ありません。それは私の母国語ではありません。

4

4 に答える 4

5

この記事をご覧になることをお勧めします: Hindley-Milner とは? (そしてなぜそれがクールなのか)

型推論を説明するために彼らが使用する最も単純な例を次に示します (ML ではありませんが、考え方は同じです)。

def foo(s: String) = s.length
// note: no explicit types
def bar(x, y) = foo(x) + y

bar の定義を見るだけで、その型が (String, Int)=>Int でなければならないことが簡単にわかります。それは一言で言えば型推論です。詳細と例については、記事全体をお読みください。

私は C++ の専門家ではありませんが、テンプレートは一般性/パラメトリック性に近いものであり、別のものだと思います。

于 2010-04-20T19:40:27.890 に答える
5

ML の型推論を C++ のほとんどすべてのものに関連付けようとすると、理解するよりも混乱を招く可能性が高いと思います。C++ には、型推論のようなものはまったくありません。

型付けを明示的にしない C++ の唯一の部分はテンプレートですが、(ほとんどの場合) テンプレートは汎用プログラミングをサポートしています。あなたが与えたようなC++関数テンプレートは、無制限の型のセットに等しく適用される可能性があります-たとえば、NumTypeテンプレートパラメーターとして使用しているコードですが、文字列で機能します。1 つのプログラムでインスタンス化してadd、1 つの場所に 2 つの文字列を追加し、別の場所に 2 つの数値を追加することができます。

ML 型推論は、ジェネリック プログラミング用ではありません。C または C++ では、パラメーターの型を明示的に定義すると、そのパラメーターで実行しようとするすべての操作がその型で許可されているかどうかがコンパイラによってチェックされます。ML はそれを逆にします。つまり、パラメーターを使用して行うことを調べ、それらのことを行うために必要な型を把握します。互いに矛盾することをしようとした場合、制約を満たすことができる型がないことがわかります。

C や C++ では、暗黙の型変換がすべて許可されているため、これはほぼ不可能です。たとえば、私が ML のようなものを持っている場合、それはすぐに int でなければならないとa + b結論付けることができますが、C または C++ では、整数型、ポインター型、または浮動小数点型のほぼすべての組み合わせになる可能性があります (それらができるという制約があります)。両方ともポインターではない) またはオーバーロードする定義済みの型(例: ) を使用します。ML では、型の検索は最悪の場合指数関数的になる可能性がありますが、ほとんどの場合、かなり高速です。C++ では、指数関数的であることがはるかに頻繁に推定され、多くの場合、おそらく制約が不足しているため、特定の関数はさまざまなシグネチャのいずれかを持つことができます。aboperator+std::string

于 2010-04-20T20:20:41.493 に答える
4

ML はHindley-Milner 型推論を使用します。この単純なケースでは、関数の本体を見て+、引数を使用してそれを返していることを確認するだけです。+したがって、引数は受け入れる引数の型 (つまり int) である必要があり、関数は返す型 (これも int) を返すと推測でき+ます。したがって、 の推定型はaddですint -> int -> int

SML (ただし CAML ではない)+では、int 以外の型についても定義されていますが、複数の可能性がある場合 (つまり、add定義した関数を使用して 2 つの float を追加することはできません) に int を推論することに注意してください。

于 2010-04-20T19:39:30.033 に答える
0

F# と ML は、型推論に関していくぶん似ているため、

F# での型推論の概要

役に立った。

于 2010-04-21T01:50:35.893 に答える