Автор оригинала: FreeCodeCamp Community Member.
Функциональное программирование было довольно открытым в глаза. Этот пост, а посты, как это, – это попытка поделиться своими представлениями и перспективами, поскольку я потраченным новым функциональным программированием.
Рамда Был моей библиотекой FP FP из-за того, насколько легче она делает функциональное программирование в JavaScript. Я настоятельно рекомендую это.
Трубка
Концепция труба
прост – это сочетает в себе N
Функции. Это труба, протекающая влево-справа, вызывая каждую функцию с выходом последнего.
Давайте напишем функцию, которая возвращает чей-то Имя
Отказ
getName = (person) => person.name; getName({ name: 'Buckethead' }); // 'Buckethead'
Давайте напишем функцию, которая в верхних учебах строки.
uppercase = (string) => string.toUpperCase(); uppercase('Buckethead'); // 'BUCKETHEAD'
Так что если мы хотели получить и заглавить человек
имя, мы могли бы сделать это:
name = getName({ name: 'Buckethead' }); uppercase(name); // 'BUCKETHEAD'
Это нормально, но давайте устраним эту промежуточную переменную Имя
Отказ
uppercase(getName({ name: 'Buckethead' }));
Лучше, но я не люблю это гнездование. Это может быть слишком многолюдно. Что, если мы хотим добавить функцию, которая получает первые 6 символов строки?
get6Characters = (string) => string.substring(0, 6); get6Characters('Buckethead'); // 'Bucket'
В результате чего:
get6Characters(uppercase(getName({ name: 'Buckethead' }))); // 'BUCKET';
Давайте очень сумасшедшим и добавим функцию на обратную строку.
reverse = (string) => string .split('') .reverse() .join(''); reverse('Buckethead'); // 'daehtekcuB'
Теперь у нас есть:
reverse(get6Characters(uppercase(getName({ name: 'Buckethead' })))); // 'TEKCUB'
Это может получить немного … много.
Труба к спасению!
Вместо шутки функций внутри функций или создания куча промежуточных переменных, давайте труба
все вещи!
pipe( getName, uppercase, get6Characters, reverse )({ name: 'Buckethead' }); // 'TEKCUB'
Чистое искусство Это как список тодо!
Давайте пройдемся через это.
Для демонстрации, я буду использовать труба
Реализация от одного из Эрик Эллиотт ‘s Функциональные программированные статьи Отказ
pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x);
Я люблю этот маленький одноклассник.
Использование Отдых Параметры, Смотрите мою статью о том, что мы можем трубить N
Функции. Каждая функция принимает выход предыдущего, и это все уменьшен ? до единого значения.
И вы можете использовать его так же, как мы сделали выше.
pipe( getName, uppercase, get6Characters, reverse )({ name: 'Buckethead' }); // 'TEKCUB'
Я буду расширяться труба
И добавьте некоторые операторы отладчика, и мы перейдем к линии по линии.
pipe = (...functions) => (value) => { debugger; return functions.reduce((currentValue, currentFunction) => { debugger; return currentFunction(currentValue); }, value); };
Позвоните труба
С нашим примером и позвольте чудесам разворачиваться.
Проверьте локальные переменные. Функции
это массив 4 функций, а ценность
это {Название: «Beashethead»}
Отказ
Так как мы использовали Отдых Параметры, труба
Позволяет любому количеству функций для использования. Это просто петлю и позвонит каждому.
На следующем отладчике мы внутри Уменьшить
Отказ Это где CurrentValue
передается на Текущая функция
и вернулся.
Мы видим результат «Beashethead»
потому что Текущая функция
Возвращает .name
Свойство любого объекта. Это будет возвращено в Уменьшить
, что означает, что это становится новым CurrentValue
в следующий раз. Давайте ударим следующий отладчик и посмотрите.
Сейчас CurrentValue
это «Beashethead»
Потому что это то, что вернулось в прошлый раз. Текущая функция
это Прописные буквы
Итак, «Beashethead»
будет следующий CurrentValue
Отказ
Та же идея, сброс «Beashethead»
первые 6 символов и передайте их к следующей функции.
Обратный (‘. AEDI EMAS’)
И вы сделали!
Как насчет составляющих ()?
Это просто труба
в другом направлении.
Так что, если вы хотели того же результата, что и наше труба
Выше вы бы сделали обратное.
compose( reverse, get6Characters, uppercase, getName )({ name: 'Buckethead' });
Обратите внимание, как getname
последний в цепочке и Обратный
сначала?
Вот быстрая реализация составить
, опять вежливость волшебных Эрик Эллиотт , от Та же статья Отказ
compose = (...fns) => (x) => fns.reduceRight((v, f) => f(v), x);
Я оставлю расширяю эту функцию с Отладчик
S как упражнение для вас. Играйте с этим, используйте его, цените это. И самое главное, повеселиться!