Standard ML、F#、OCaml、Haskellなどの静的に型付けされた関数型プログラミング言語では、関数は通常、パラメーターを互いに分離し、関数名から空白で区切って記述されます。
let add a b =
a + b
ここでの型は" int -> (int -> int)
"です。つまり、intを受け取り、その順番がintを取り、最後にintを返す関数を返す関数です。これによりカリー化が可能になります。
タプルを引数として取る同様の関数を定義することもできます。
let add(a, b) =
a + b
この場合、タイプは「(int * int) -> int
」になります。
言語設計の観点から、型代数でこれら2つの型パターンを単純に識別できない理由はありますか?つまり、「(a * b)->c」が「a->(b-> c)」になり、両方のバリアントを同じように簡単にカレーできるようになります。
私が言及した4つの言語のような言語が設計されたとき、この質問が浮かび上がったに違いないと思います。では、これら4つの言語すべてがこれら2つのタイプのパターンを「統合」しないことを選択した理由を示す理由や調査を知っている人はいますか?