-
-
Save kutyel/818937bda1bf1f513ff63e517342d194 to your computer and use it in GitHub Desktop.
// Ultimate version | |
const curry = (f, ...args) => | |
f.length <= args.length | |
? f(...args) | |
: x => curry(f, ...args, x) |
This is the version I've been using in examples:
const curry = (
f, arr = []
) => (...args) => (
a => a.length === f.length ?
f(...a) :
curry(f, a)
)([...arr, ...args]);
Awesome π Thanks very much! I just noticed I need the second ...args
in the recursive call to curried
π
I see what you did there with the default param, very clever! π€ I was actually looking for a way to return that lambda without the function
keyword, and here I have my answer π
Hi! I'm here because I watched again your talk about Lenses in Lambda World (again = I was there that day π ). Congrats for it!
I would like to know what do you think about these concerns:
- The possibility of calling that function with more than one parameter. For example, a different
arity
could be passed. - The possibility of not having unary functions because of
(...argz)
.
Here I have another version to avoid those things: https://gist.github.com/rachelcarmena/196b9f8b1c6b078b65fb1328f09c0269
What do you think about it? Do you think that my concerns make sense?
Thanks in advance!
Hi Rachel! Thanks for the compliments, I'm glad you like the talk!
const curry = (f, ...args) => f.length <= args.length ? f(...args) : x => curry(f, ...args, x)
The argz
thing was added by @ericelliott, I don't really remember now why to be honest π
Thanks @kutyel! I'd remove all the additional parameters. For example, this situation would be possible:
const sum = (a, b) => a + b;
const curriedSum = curry(sum);
const wrongCurriedSum1 = curry(sum, 2); // a function with one parameter
console.log(wrongCurriedSum1(3)); // 5
const wrongCurriedSum2 = curry(sum, 2, 3); // not a function, but 5
const wrongCurriedSum3 = curry(sum, 2, 3, 4); // not a function, but 5
Thanks again!
That version is not a full auto-curry.
Try this: