Мы говорим о карри, который так восхитительно пахнет, но
НА САМОМ ДЕЛЕ НЕ ЕДА 😁
Мы говорим о функциях карри в javascript и о том, как они могут быть такими полезными в вашем коде…

Пойдем...

Общее определение карри:

. Назван в честь математика по имени Хаскелл Б. Карри
. Это концепция из лямбда-исчисления

Пусть это вас не смущает, понять будет не так уж сложно…

  • Лечение принимает функцию, которая получает более одного параметра
  • Разбивает его на серию унарных (однопараметрических) функций, которые получают только один параметр.
  • Поэтому каррированная функция принимает только один параметр за раз,

Давайте рассмотрим несколько примеров:

Пример 1:

const buildSandwich = (ingredient1) => {
   return (ingredient2) => {
         return (ingredient3) => {
               return `${ingredient1}, ${ingredient2}, ${ingredient3}`;
         }
   }
}

const mySandwich = buildSandwich("Bacon")("Lettuce")("Tomato");

Пояснение к примеру 1:

У меня есть функция с именем buildSandwich, и я передаю ингредиент,
функция возвращает другую функцию, и это просто анонимная функция, которая получает >ингредиент два, а затем эта анонимная функция возвращает другую функцию, и это анонимная функция, которая получает ингредиент три,наконец, эта последняя функция просто возвращает шаблон буквально, где мы соединяем ингредиенты для моего бутерброда.

Но то, что мы сделали, это вложенные функции

Одна функция вызывает следующую, и поэтому, если бы мы вызывали это, мы бы вызвали ее вместо того, чтобы передавать все параметры в одном наборе круглых скобок.

Сначала мы объявили константу с именем mySandwich,затем мы вызываем buildSandwich и передаем строку "bacon", а затем передаем >«салат» для следующей функции, а затем «помидор» для следующей функции, так что эта одна большая функция buildSandwich действительно разбита на три функции, и каждая получает только один параметр

Постоянный возврат mySandwich Бекон, салат, помидор

Вы можете видеть, что я получаю сэндвич с беконом”,салатом” и “помидором”, но мы сделали эту функцию карри, потому что переходим от одной функции к другой и поэтому мы вызываем его каждый раз только с одним параметром

Проведем рефакторинг

Пример 2:

const buidSammy = ingred1 => ingred2 => ingred3 => `${ingred1}, ${ingred2}, ${ingred3}`

const mySammy = buildSammy("turkey")("cheese")("bread")

Пример пояснения 2:

Это больше похоже на то, как вы могли бы видеть функцию с функциональным программированием, как правило, больше выражений

Вместо императивного пошагового вызова все подряд, но мы можем просто передавать по одной части за раз, чтобы мы могли вызывать

Константа buildSammy возвращает индейку, сыр, хлеб

Пример 3:

Итак, давайте рассмотрим еще несколько примеров, вот еще один пример функции, которая умножает

const multiply = (x, y) => x * y

То, что я создал, и это наша стандартная стрелочная функция, я передаю параметры x и y, а затем она просто умножает x раз г

А теперь посмотрите на каррированную версию умножения:

const curriedMultiply = x => y => x * y

Пример пояснения 3:

  • Если мы вызовем нашу функцию с помощью этого метода
curriedMultiply(2, 3)

Константа curriedMultiply не будет работать в этом return f()🙃

  • Если мы вызовем нашу функцию с помощью этого метода
curriedMultiply(2)

Но если мы вызовем каррированное умножение и просто передадим первый параметр

константа curriedMultiply не будет работать в этом возврате f()🙃

  • Если мы вызовем нашу функцию с помощью этого метода
curriedMultiply(2)(3)

Если мы продолжим и вызовем каррированное умножение с двумя отдельными параметрами, то получим число 6.

Константа curriedMultiply возвращает число 6 🙂

Поэтому функция не завершится, пока не получит все параметры

const timesTen = curriedMultiply(10)

Теперь давайте посмотрим на это. У нас есть частично применяемые функции, а частично применяемые функции очень часто используются при лечении, поэтому теперь я установил переменную timesTen, равную моему curriedMultiply, и я уже передал первый параметр, поэтому он применяется частично

тем не менее, функции нужен параметр y

const timesTen = curriedMultiply(10)
timesTen(8) 

Поэтому в любое время, когда я хочу позвонить timesTen, я просто передаю одно число, например
число восемь
, и если мы сохраним это, вы увидите, что мы получаем 80
Итак, у меня есть функция timesTen, которая принимаетодин параметр и любой параметр, который я передаю, будет умножить на 10.

Таким образом, это позволяет нам создавать функции, из которых мы можем затем создавать пользовательские функции, поэтому мы взяли curriedMultiply и сделали его timesTen, и было бы так же легко взять curriedMultiply и умножьте его на 20, 15 или любое другое число.

Спасибо!