简单回答
Curry: 允许您调用一个函数,将其拆分为多个调用,每次调用提供 一个 参数。
部分:允许您调用一个函数,将其拆分为多个调用,为每个调用提供多个参数。
简单提示
两者都允许您调用提供更少参数的函数(或者,更好的是,累积提供它们)。实际上,它们都(在每次调用时)将特定值绑定到函数的特定参数。
当函数的参数超过 2 个时,可以看出真正的区别。
简单e(c)(示例)
(在 Javascript 中)
我们想在不同的subjects 上运行以下process 函数(例如,假设我们的主题是"subject1" 和"foobar" 字符串):
function process(context, successCallback, errorCallback, subject) {...}
为什么总是传递参数,比如上下文和回调,如果它们总是相同的?
只需为函数绑定一些值:
processSubject = _.partial(process, my_context, my_success, my_error)
// assign fixed values to the first 3 arguments of the `process` function
并在 subject1 和 foobar 上调用它,省略前 3 个参数的重复,使用:
processSubject('subject1');
processSubject('foobar');
舒服,不是吗? ?
使用 currying 你需要每次传递一个参数
curriedProcess = _.curry(process); // make the function curry-able
processWithBoundedContext = curriedProcess(my_context);
processWithCallbacks = processWithBoundedContext(my_success)(my_error); // note: these are two sequential calls
result1 = processWithCallbacks('subject1');
// same as: process(my_context, my_success, my_error, 'subject1');
result2 = processWithCallbacks('foobar');
// same as: process(my_context, my_success, my_error, 'foobar');
免责声明
我跳过了所有的学术/数学解释。因为我不知道。也许它有帮助?
编辑:
@basickarl 补充说,这两个函数在使用上的细微差别(参见 Lodash 示例)是:
-
partial 返回一个预编译函数,可以使用缺少的参数调用一次并返回最终结果;
-
curry被多次调用(每个参数一个),每次都返回一个预编译的函数;除了使用最后一个参数调用的情况外,这将返回处理所有个参数的实际结果。
使用 ES6:
这是一个quick example,介绍了 ECMAScript 6 中的 Currying 和 Partial-application 的即时性。
const curriedSum = math => eng => geo => math + eng + geo;
const partialSum = math => (eng, geo) => math + eng + geo;