在静态类型的函数式编程语言中,如标准 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
在这种情况下,类型变为“ ”。
从语言设计的角度来看,有什么理由不能简单地识别类型代数中的这两种类型模式?换句话说,使得“(a * b) -> c”简化为“a -> (b -> c)”,从而允许两个变体同样容易地被柯里化。
我想这个问题一定是在设计我提到的四种语言时出现的。那么有没有人知道任何原因或研究表明为什么所有这四种语言都选择不“统一”这两种类型模式?