[theory] 关于克里化的一个小误区

Lich_Ray 2007-11-08
我们常常用与 f(a, b, c) == f(a)(b)(c) == f(a, b)(c) 类似的例子作为吸引Currying初学者的"Cookies",结果,不幸的是,很多人就是这样认为的(更令人无语的是,专业人士也常常把他们的扩展写成这样,比如 Functional JavaScript 和 Scalar 的语法设计)。然而事实上,所谓的克里化应当是:(f(a)(b)(c)) == (f(a))(b)(c) == (f(a)(b))(c)
但如果是这样的话,克里化岂不是更繁琐吗?根本不是那么回事。根据 Haskell(这里指的是人!)的 Lambda 演算理论,多参数函数本身就是单参数函数的语法糖:
function f (a, b, c) { /* code */ }
// 等价于
function f (a) { 
    return function (b) {
        return function (c) {
        /* code */
        }
    }
}

比方说 code 为 return a+b+c ,那么 f(1)(5)(3) == 9 ,这才是克里化。想要语法漂亮一点的话用 Miranda Haskell Clean 之类的语言就行了。
 
Global site tag (gtag.js) - Google Analytics