Currying 将一个接受 N 个参数的函数转换为 N 个函数的链,每个函数接受一个参数。偏函数应用现在固定某些参数,并返回一个等待其余参数的函数。
js
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
Currying 将一个接受 N 个参数的函数转换为 N 个函数的链,每个函数接受一个参数。偏函数应用现在固定某些参数,并返回一个等待其余参数的函数。
= () => a + b + c;
= a => a + b + c;
()()();
add10 = ();
()();
每一步都使用闭包来记住早期的参数,直到所有参数都被提供。
const log = level => message => console.log(`[${level}] ${message}`);
const error = log("ERROR"); // reusable, pre-configured logger
const info = log("INFO");
error("disk full"); // [ERROR] disk full
不是到处重复该级别,而是一次创建配置的函数。这在函数管道和事件处理程序中表现出色:
const onChange = field => e => setForm(f => ({ ...f, [field]: e.target.value }));
<input onChange={onChange("email")} /> // a handler specialized to "email"
库(Ramda、lodash curry)会自动对任何函数进行 curry,以便您可以灵活地按组提供参数。
Currying 启用了干净的函数组合、可重用的配置回调和 point-free 风格。
它在函数式代码库中很常见,也是测试对闭包理解的常见面试问题。