Partial function application: Difference between revisions

Content deleted Content added
Hout (talk | contribs)
Hout (talk | contribs)
→‎JS ES6: Elaborating a JS curry to a form which works with functions of arbitrary arity
Line 1,061: Line 1,061:
fs = map,
fs = map,


fsf1 = fs(f1),
fsf2 = fs(f2);

// TEST -------------------------------------------------------------------
return [
fsf1([0, 1, 2, 3]),
fsf2([0, 1, 2, 3]),

fsf1([2, 4, 6, 8]),
fsf2([2, 4, 6, 8])
];
})();</lang>
{{Out}}
<pre>[[0, 2, 4, 6], [0, 1, 4, 9], [4, 8, 12, 16], [4, 16, 36, 64]]</pre>

The simple version of the higher-order '''curry''' function above works only on functions with two arguments. For more flexibility, we can generalise it to a form which curries functions with an arbitrary number of arguments:

<lang JavaScript>(() => {
'use strict';
// GENERIC FUNCTIONS ------------------------------------------------------

// 2 or more arguments
// curry :: Function -> Function
const curry = (f, ...args) => {
const go = xs => xs.length >= f.length ? (f.apply(null, xs)) :
function () {
return go(xs.concat([].slice.apply(arguments)));
};
return go([].slice.call(args, 1));
};

// map :: (a -> b) -> [a] -> [b]
const map = curry((f, xs) => xs.map(f));

// PARTIAL APPLICATION ----------------------------------------------------
const
f1 = x => x * 2,
f2 = x => x * x,

fs = map,
fsf1 = fs(f1),
fsf1 = fs(f1),
fsf2 = fs(f2);
fsf2 = fs(f2);