【发布时间】:2009-01-02 00:47:53
【问题描述】:
在静态类型的函数式编程语言中,例如标准 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)”,这两种变体都可以同样容易地被柯里化。
我认为这个问题一定是在设计像我提到的四种语言时出现的。那么有没有人知道任何原因或研究表明为什么所有这四种语言都选择不“统一”这两种类型模式?
【问题讨论】:
标签: haskell f# functional-programming language-design type-systems