Π ΡƒΠ±Ρ€ΠΈΠΊΠΈ
Π‘Π΅Π· Ρ€ΡƒΠ±Ρ€ΠΈΠΊΠΈ

πŸ› Π§Ρ‚ΠΎ, Ρ‡Π΅Ρ€Ρ‚ возьми, ΠΊΠ°Ρ€Ρ€ΠΈ? Ρ„ΡƒΡ‚ΠΎΠ² Javascript

ΠšΠ°Ρ€Ρ€ΠΈ – это общая концСпция Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ программирования, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим, Ρ‡Ρ‚ΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΊΠ°Ρ€Ρ€ΠΈ, ΠΈ ΠΊΠ°ΠΊ ΠΊΠ°Ρ€Ρ€ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π½Π°ΡˆΡƒ Тизнь ΠΏΡ€ΠΎΡ‰Π΅. Tagged с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavaScript, Currying, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ, программирования.

Π― знаю, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΡΠ»ΡŽΠ½ΠΎΠΎΡ‚Π΄Π΅Π»Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΈΡ€ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² стал слишком вкусным с Jamstack, ΠΈ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ я Π³ΠΎΠ²ΠΎΡ€ΡŽ ΠΎ ΠšΠ°Ρ€Ρ€ΠΈ? ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Π²Ρ‹ смоТСтС Π΄ΠΎ смСрти с этими чудСсами Dev World, ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ вас Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ являСтся ΠΊΠ°Ρ€Ρ€ΠΈ.

ΠšΠ°Ρ€Ρ€ΠΈΠ½Π³ Π±Ρ‹Π» Π½Π°Π·Π²Π°Π½ Π² Ρ‡Π΅ΡΡ‚ΡŒ Haskell Curry , ΠΏΠΎ сути, Π·Π°Π²ΠΎΠ΄, Ρ‚Π°ΠΊ это Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π΅Π΅ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π·Π°Ρ‚Π΅ΠΌ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.

ΠšΠ°Ρ€Ρ€ΠΈ Π½Π΅ зависит ΠΎΡ‚ JavaScript, это Ρ‚Π°ΠΊΠΆΠ΅ матСматичСская Π²Π΅Ρ‰ΡŒ, ΠΊΠ°ΠΊ функция (ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ ΠΎΠ» (x)?)

// Not curried
const add = (x, y) => x + y

// Curried
const add = x => y => x + y
const addFive = add(5)
addFive(6) // 11

Как Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°Ρ€Ρ€ΠΈ, ΠΌΡ‹ смогли ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΎΠ»Π΅Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚, это, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ наш ΠΊΠΎΠ΄.

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠ°Ρ€Ρ€ΠΈΠΊΠΈ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎ сущСству ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΠΎΠΌΠ½ΠΈΡ‚ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹.

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ Π² ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π΅Π½ΠΈΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΡ€ΠΈΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π­Ρ‚Π° функция Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ„Π½ ΠΈ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ $ curry Π­Ρ‚ΠΎ Π±Π΅Ρ€Π΅Ρ‚ ΠΎΠ΄ΠΈΠ½ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ ΠΈ выполняСт Ρ€Π°Π±ΠΎΡ‚Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Ρ„Π½ .

Π”Π°Π²Π°ΠΉΡ‚Π΅ сдСлаСм это шаг Π·Π° шагом

// This function takes a function `fn` as a parameter.
function curry(fn) {
  // Let us determine the arity of `fn`
  // Arity is the number of parameter taken by `fn`
  const arity = fn.length

  // ...
}
function curry(fn) {
  const arity = fn.length

  // Let's return the $curry function.
  // Let's have all the arguments ( ...args ) being passed in $curry
  // Remember we are returning a function so we can pass args in it.
  return function $curry(...args) {
    // ...
  }
}
function curry(fn) {
  const arity = fn.length
  return function $curry(...args) {
    // Let's return the function with all the passed arguments.
    // This code maybe stupid until you read the next para...
    return $curry.bind(null, ...args)

    // ...
  }
}

ΠœΡ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ просто ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ вмСстС ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Ρ…ΠΎΠ΄.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ условиС для этого.

function curry(fn) {
  const arity = fn.length
  return function $curry(...args) {
    if (args.length < arity) {
      return $curry.bind(null, ...args)
    }
    return fn.call(null, ...args)
  }
}

Бравнивая Π΄Π»ΠΈΠ½Ρƒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² args.length ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π½Π°Ρ‚ΡŒ, сколько Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π±Ρ‹Π»ΠΎ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½ΠΎ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

ВсС станСт Π±ΠΎΠ»Π΅Π΅ ясным, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ я Π΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽ, ΠΊΠ°ΠΊ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ°Ρ€Ρ€ΠΈ Ѐункция для привлСчСния Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ нСсколько ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π Π°Π΄ΠΈ простоты Π΄Π°Π²Π°ΠΉΡ‚Π΅ возьмСм Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ функция, которая ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ 3 значСния (ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹) ΠΈ добавляСт ΠΈΡ… вмСстС.

const add = (x, y, z) => x + y + z

const curriedAdd = curry(add)

const addFive = curriedAdd(5) // args.length = 1

const addFiveAndSix = addFive(6) // args.length = 2

const output = addFiveAndSix(8) // args.length = 3

// The funciton can be called now as `args.length` < arity is false.
console.log(output) // 19

args.length ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ Π½Π°ΠΌ количСство Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠ· -Π·Π° return $ curry.bind (null, ... args) АнкСт $ curry Ѐункция содСрТит всС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ Π²Ρ‹ΡˆΠ΅ любого Π΄Π°Π½Π½ΠΎΠ³ΠΎ экзСмпляра.

Π― надСюсь, Ρ‡Ρ‚ΠΎ это прояснит всС ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ функция. Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ -Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ сомнСния, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΠΌ Π² Π’Π²ΠΈΡ‚Ρ‚Π΅Ρ€Π΅.

( @ yashguptaz )

Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ вкуса Π² ваш ΠΊΠΎΠ΄.

ΠšΠ°Ρ€Ρ€ΠΈ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ прСкрасному явлСнию, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΌΡƒ частичным ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ. Богласно Π’ΠΈΠΊΠΈΠΏΠ΅Π΄ΠΈΠΈ частичноС ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ ΠΊΠ°ΠΊ –

ЧастичноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ относится ΠΊ процСссу исправлСния ряда Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, создавая Π΄Ρ€ΡƒΠ³ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ мСньшСго количСства артистиков.

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ довольно простоС, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ количСство ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ выполняСт функция, заставляя Π΅Π΅.

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΊΠ°Ρ€Ρ€ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ извСстная функция ΠΊΠ°Ρ€Ρ‚Π° ΠΈ посмотритС, ΠΊΠ°ΠΊ это мСняСт Π½Π°ΡˆΡƒ Тизнь.

// Before Currying
const allTheChildren = elements => map(elements, getChildren)

// Let's curry map
const map = curry((fn, f) => f.map(fn))

// AFter Currying
const allTheChildren = map(getChildren)

Π­Ρ„Ρ„Π΅ΠΊΡ‚ становится Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ΠΌ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ ΠΊΠ°Ρ€Ρ‚Π° ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·. И Π²ΠΎΡ‚ ΠΊΠ°ΠΊ ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅ΠΌ Ρ‚ΠΎΠ½Π½Ρƒ ΠΊΠΎΠ΄Π° шаблона.

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ привСсти Π² ΠΊΠ°Ρ€Ρ€ΠΈ практичСски Π»ΡŽΠ±ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. И ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ частичноС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π Π°Π·Π²Π΅ это Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ? Π₯отя я Π½ΠΎΠ²ΠΈΡ‡ΠΎΠΊ Π² ΠΊΠ°Ρ€Ρ€ΠΈΠΈΠ½Π³Π΅, ΠΌΠ½Π΅ Π±Ρ‹Π»ΠΎ интСрСсно ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ. Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ‡Π΅ΠΌ -Ρ‚ΠΎ ΠΈΠ»ΠΈ Π·Π°Π΄Π°Ρ‚ΡŒ вопрос ΠΈΠ»ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΠΎΠ½ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ -Ρ‚ΠΎ вмСстС, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ мСня Π² Twitter. Π― @yashguptaz Π² Π˜Π½Ρ‚Π΅Ρ€Π½Π΅Ρ‚Π΅.

Π‘Π»Π΅Π΄ΡƒΠΉΡ‚Π΅ Π·Π° ΠΌΠ½ΠΎΠΉ Π² Π’Π²ΠΈΡ‚Ρ‚Π΅Ρ€Π΅, ΠΊΠΎΠ³Π΄Π° я ΠΏΠΈΡˆΡƒ Π² Π’Π²ΠΈΡ‚Ρ‚Π΅Ρ€Π΅ ΠΎ своСм экспСримСнтС с Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ.

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»: “https://dev.to/yashguptaz/what-the-heck-is-currying-ft-javascript-jlp”