Π― Π·Π½Π°Ρ, ΡΡΠΎ Π²Ρ ΡΠ»ΡΠ½ΠΎΠΎΡΠ΄Π΅Π»Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΌΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΡΡΠ°Π» ΡΠ»ΠΈΡΠΊΠΎΠΌ Π²ΠΊΡΡΠ½ΡΠΌ Ρ 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”