静的型付けに関する Yegge (および Ola Bini の) の意見を参考にします。静的型付けの利点を理解できれば、選択したプログラミング言語の型システムがどのように機能するかがわかります。
IIRC、ML はタプルに '*' 構文を使用します。<type> * <type> は 2 つの要素を持つタプル型です。したがって、(1, 2) は int * int 型になります。
Haskell と ML はどちらも -> を関数に使用します。ML では、int * int -> int は、int と int のタプルを取り、それを int にマップする関数の型になります。
別の言語から ML に来たときに Ola が引用したものと漠然と似ているエラーが表示される理由の 1 つは、C や Pascal で行うように、括弧とコンマを使用して引数を関数に渡そうとした場合です。 2 つのパラメーターを取ります。
問題は、関数型言語は通常、関数を返す関数として複数のパラメーターを持つ関数をモデル化することです。すべての関数は引数を 1 つだけ取ります。関数が 2 つの引数を取る必要がある場合は、代わりに引数を取り、最終結果を返す単一の引数の関数を返します。これらすべてを読みやすくするために、関数の適用は単純に結合して行います (つまり、式を互いに並べて配置します)。
したがって、ML の単純な関数 (注: ML として F# を使用しています) は、次のようになります。
let f x y = x + y;;
タイプがあります:
val f : int -> int -> int
(整数を取り、それ自体が整数を取り、整数を返す関数を返す関数。)
ただし、単純にタプルで呼び出すと、次のようになります。
f(1, 2)
... int*int を int を期待するものに渡したため、エラーが発生します。
これが、オラが中傷を投げかけようとしていた「問題」だと思います。ただし、彼が考えているほど問題は深刻ではないと思います。確かに、C++ テンプレートではさらに悪化します。