Я изучаю функциональное программирование на JS и пытаюсь написать свой собственный pluck.
const curry = (f, arr = []) => (...args) =>
(a => (a.length === f.length ? f(...a) : curry(f, a)))([
...arr,
...args,
]);
const map = curry((fn, arr) => arr.map(fn));
const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x);
const prop = curry((key, obj) => obj[key]);
const pluck = pipe(prop, map);
Но почему-то pluck не работает. Насколько я думал, этот щипок будет:
prop ключом, которым я вызываю pluck.prop с карри key помещается как функция в map, которая возвращается из pipe.prop с ключом.Но,
pluck('foo')([{ foo: 'bar'}]);
[ƒ]
Что я делаю неправильно?
Возможно, вы захотите использовать a.length >= f.length
@ Берги Почему это?
@J.Hesters Посмотрите, что add = curry((a, b) => a+b) возвращает для звонков add(1), add(1,2)/add(1)(2) и add(1,2,3)/add(1)(2,3). Учитывая объяснение Пойнти, это именно то, что происходит с каррированной (и частично примененной) функцией prop, когда map вызывает ее.
@ Берги, понял! Спасибо, что научил меня этому.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Поскольку встроенная функция .map() передает обратному вызову 3 аргумента, ваш код становится запутанным. Это легко исправить:
const map = curry((fn, arr) => arr.map(v => fn(v)));
Встроенная функция
.map()передает своему обратному вызову 3 аргумента: значение элемента массива, индекс и сам массив.