Currying vs. aplicação parcial

Estou terminando o JavaScript Funcional de Mike Fogus. Ótima leitura. Realmente ajuda a esclarecer as diferenças entre currying e aplicação parcial. Já vi algumas pessoas confundirem os termos, então queria postar um trecho aqui.

//Currying vs. Partial

const add = (x, y) => x + y;
const addAny = (...args) => {
return args.reduce((prev, next) => prev + next, 0);
}

// curry to specific depth
function curry(fun, x) {
return function(y) {
return fun(x, y);
}
}

// partial to any number of arguments
function partial(/* pargs */) {

const pargs = [...arguments];
const fun = pargs.shift();

return function(/* bargs */) {
const bargs = [...pargs, ...arguments];
return fun.apply(fun, bargs);
}
}


const add10 = curry(add, 10);
console
.log('curry', add10(10)); // 20

const partial10 = partial(add, 10);
console
.log('partial', partial10(12)); // 22

const partialAny = partial(addAny);
console
.log('partialAny', partialAny(1, 2, 3, 1)); // 7