FP mecanografiado: argumentos de tupla y argumentos curriables

En lenguajes de programación funcional tipados estáticamente, como Standard ML, F #, OCaml y Haskell, una función generalmente se escribirá con los parámetros separados uno del otro y del nombre de la función simplemente por espacios en blanco:

let add a b =
    a + b

El tipo aquí es "int -> (int -> int)", es decir, una función que toma un int y devuelve una función que toma su turno e int y que finalmente devuelve un int. Por lo tanto, el curry se hace posible.

También es posible definir una función similar que tome una tupla como argumento:

let add(a, b) =
    a + b

El tipo se convierte en "(int * int) -> int" en este caso.

Desde el punto de vista del diseño del lenguaje, ¿hay alguna razón por la que uno no pueda simplemente identificar estos dos patrones de tipo en el álgebra de tipos? En otras palabras, para que "(a * b) -> c" se reduzca a "a -> (b -> c)", permitiendo que ambas variantes se cursen con la misma facilidad.

Supongo que esta pregunta debe haber surgido cuando se diseñaron idiomas como los cuatro que mencioné. Entonces, ¿alguien sabe alguna razón o investigación que indique por qué los cuatro idiomas eligieron no "unificar" estos dos patrones de tipo?

Respuestas a la pregunta(5)

Su respuesta a la pregunta