Partial function application: Difference between revisions
Content deleted Content added
→{{header|JavaScript}}: ES6 version |
→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); |