Опять же, эта история для тех, кто плохо знаком с идеей функционального программирования.

Какова была бы ваша реакция, если бы кто-то сказал вам, что вы не должны использовать какие-либо циклы (for, while и т. д.), ваша первая мысль могла бы быть такой: как вообще возможно написать осмысленное программное приложение без них.

В некотором смысле вы правы, очень редко у вас нет списка элементов для повторения, поэтому действительно невозможно сделать что-либо значимое без массива/списка или чего-то подобного в вашем коде. Когда в функциональном программировании говорят, что циклов for/while нет, что отчасти верно, это не означает, что вы не можете перебирать список элементов. Все, что вам нужно сделать, это найти подходящие функции, которые могли бы выполнять часть итерации без написания цикла for. Идея заключается в том, что, избегая циклов, вы избегаете возможности создания большего количества переменных, которые могут загрязнить область действия программы, а также сохраняете поток программы простым и однонаправленным.

Наиболее распространенные сценарии, которые вы делаете с циклом:

  • Фильтр — найдите элемент в списке — скажем, у вас есть список учеников, и вы хотите перебрать список, чтобы найти всех учеников, чье имя начинается с «А».
  • Карта — повторите список и верните новый список — снова, если у вас есть тот же список студентов (объект), и вы хотите отметить их как пройденных или не пройденных на основе их оценок (или, может быть, просто присвоить каждому случайный номер, если вы хочу упростить)
  • Уменьшить — перебрать список и вернуть одно значение — возможный сценарий с одним и тем же списком учеников — просто добавить деньги, которые есть у каждого в кармане, и вернуть все деньги, которые есть у этого класса.

Теперь, если вы программист JavaScript, вы уже знаете, что все вышеперечисленные сценарии на самом деле не требуют цикла, поскольку имена (filter, map и reduce) на самом деле являются API, которые вы можете вызывать для объекта массива!

Фильтр, Карта, Уменьшение и многие другие подобные API хорошо документированы здесь.

Хотя приведенные выше API уже являются частью JavaScript и многих других языков, спросите себя, как часто вы на самом деле думаете о них, прежде чем начать:

for (var i =0; i ‹ array.length ; i++) { ….

Против.

[1,2,3].map(Math.pow) // все, готово

Большинство программистов традиционно запрограммированы (приучены) думать в терминах циклов, поэтому им никогда не приходит в голову использовать некоторые из этих доступных API, если вы уже не использовали их один или два раза.

Итак, теперь, когда вам нужно написать цикл for/while, спросите себя, можете ли вы использовать карту/фильтр/сокращение и т. д. и сделать свой код более функциональным.

Вам не нужно никому говорить в вашей команде, что вы занимаетесь функциональным программированием, и при этом вы можете следовать всем этим функциональным подходам практически на всех языках. Даже если вы занимаетесь объектно-ориентированным программированием, вы все равно можете использовать концепции функционального программирования на уровне функций/методов.

Больше таких базовых концепций в будущих постах…