Функциональный состав щипка

Я изучаю функциональное программирование на 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'}]);
[ƒ]

Что я делаю неправильно?

Встроенная функция .map() передает своему обратному вызову 3 аргумента: значение элемента массива, индекс и сам массив.

Pointy 13.07.2019 18:35

Возможно, вы захотите использовать a.length >= f.length

Bergi 13.07.2019 20:23

@ Берги Почему это?

J. Hesters 13.07.2019 21:38

@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 вызывает ее.

Bergi 13.07.2019 21:44

@ Берги, понял! Спасибо, что научил меня этому.

J. Hesters 13.07.2019 21:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку встроенная функция .map() передает обратному вызову 3 аргумента, ваш код становится запутанным. Это легко исправить:

const map = curry((fn, arr) => arr.map(v => fn(v)));

Другие вопросы по теме