Javascript Currying VS Partial Application - Lee-hyuna/33-js-concepts-kr GitHub Wiki

Javascript- Currying VS Partial Application

λ²ˆμ—­ : https://medium.com/datadriveninvestor/javascript-currying-vs-partial-application-4db5b2442be8

λ§Žμ€ μ‚¬λžŒλ“€μ΄ 컀링과 νŒŒν‹°μ…œ μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ„ ν˜Όλ™ν•©λ‹ˆλ‹€. 그리고 λ§Žμ€ μ‚¬λžŒλ“€μ΄ μ–Έμ œ 무엇을 μ–΄λ””μ„œ μ‚¬μš©ν•΄μ•Ό 할지λ₯Ό 잘 λͺ¨λ¦…λ‹ˆλ‹€. κ·Έλž˜μ„œ 이 ν¬μŠ€νŠΈλŠ” κ·Έλ“€ μ‚¬μ΄μ˜ μ‚¬μš©λ²•κ³Ό 차이점을 닀뀄보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€.

Currying

N개의 인수λ₯Ό 가진 ν•¨μˆ˜ ν˜ΈμΆœμ„ 각 ν•¨μˆ˜ ν˜ΈμΆœμ— λŒ€ν•΄ 단일 인수λ₯Ό 가진 N ν•¨μˆ˜ 호좜 체인으둜 λ³€ν™˜ν•˜λŠ” κΈ°μˆ μž…λ‹ˆκΉŒ?

Currying은 λͺ¨λ“  μΈμˆ˜κ°€ 적용될 λ•ŒκΉŒμ§€ 항상 ν•˜λ‚˜μ˜ 인수둜 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ λͺ¨λ“  인수λ₯Ό λ‹€ μ‚¬μš©ν•˜κ³  μ΅œμ’… 값이 λ°˜ν™˜ 될 λ•ŒκΉŒμ§€ λ°˜ν™˜ 된 ν•¨μˆ˜λ₯Ό 계속 ν˜ΈμΆœν•©λ‹ˆλ‹€.

// Normal function  
function addition(x, y) {  
   return x + y;  
}

// Curried function  
function addition(x) {  
   return function(y) {  
     return x + y;  
   }  
}

μ°Έκ³  : CurryλŠ” 이진 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 단항 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 단항 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. JavaScript μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function curry(f) {  
  return function(x) {  
    return function(y) {  
       return f(x, y);  
    }  
  }  
}

μ°Έκ³  : 컀링이된 ν•¨μˆ˜μ—λŠ” 반볡자 λ™μž‘μ΄ λ‚΄μž₯λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μΈμˆ˜κ°€ 적용되고 λ‹€μŒ λ‹¨κ³„μ—μ„œ μ‚¬μš©ν•  호좜 ν•¨μˆ˜λ‘œ λ¦¬ν„΄λ©λ‹ˆλ‹€. λ°˜λ³΅μžμ— λŒ€ν•΄ μ—¬κΈ°hereλ₯Ό μ½μœΌμ‹­μ‹œμ˜€.

Usages

  1. 컀리 ν•¨μˆ˜μ˜ 일반적인 μ‚¬μš© μ‚¬λ‘€λŠ” ** ν•¨μˆ˜ ꡬ성 **μž…λ‹ˆλ‹€ (예 :p (x) = q (r (x))). 즉, 인수λ₯Ό μ „λ‹¬ν•˜μ—¬ 이전 ν•¨μˆ˜μ—μ„œ μƒˆ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•©λ‹ˆλ‹€. ν•¨μˆ˜ q λŠ” ν•¨μˆ˜ r 의 인수둜 λ°˜ν™˜ 값을 λ°›μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λŠ” ν•˜λ‚˜μ˜ κ°’λ§Œ λ°˜ν™˜ ν•  수 μžˆμœΌλ―€λ‘œ λ°˜ν™˜ 값에 μ μš©λ˜λŠ” ν•¨μˆ˜λŠ” 단항이어야 ν•©λ‹ˆλ‹€.

  2. 컀링된 ν•¨μˆ˜λŠ” 일반 κΈ°λŠ₯을 생성 ν•  μˆ˜μžˆλŠ” λ§Žμ€ κ°€λŠ₯μ„±μ΄μžˆλŠ” ν”„λ‘œμ νŠΈμ˜ ** 인프라ꡬ쑰 μ„€μ • ** λ™μ•ˆμ—λ„ μ‚¬μš©λ  수 μžˆμœΌλ―€λ‘œ μž‘μ€ 쑰각을 μ‰½κ²Œ κ΅¬μ„±ν•˜κ³  μž¬μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  3. Ramda.js 라이브러리. ν•¨μˆ˜λŠ” μžλ™μœΌλ‘œ 컀링되며 lodashμ—λŠ” curryλΌλŠ” ν•¨μˆ˜κ°€ 있으며이 ν•¨μˆ˜λŠ” 컀링 κΈ°λŠ₯을 λ§Œλ“œλŠ” 데 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  4. Memoization 컀링 ν•¨μˆ˜λ₯Ό μœ„ν•œ λ‹€λ₯Έ 쒋은 μΌ€μ΄μŠ€ μž…λ‹ˆλ‹€.

  5. Handling error μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚€λŠ” ν•¨μˆ˜μ˜ 핸듀링과 μ—λŸ¬ 직후 μ¦‰μ‹œ μ’…λ£Œ 처리.

  6. APIμ—μ„œμ˜ Catching multiple error and use it as a validator μ²˜λ¦¬μ™€ ν΄λΌμ΄μ–ΈνŠΈ μ‚¬μ΄λ“œ μ½”λ“œ.

  7. ν•¨μˆ˜λ₯Ό 인자둜 λ°›μ•„μ„œ κ·Έ 값을 리턴할 수 μžˆλŠ” First class functions λ₯Ό 생성할 수 μžˆλ‹€.

const func1 = () => console.log ('Hey Medium.');  
const firstClassfunc1 = argsFunc => argsFunc();  
const firstClassfunc2 = () => func1;  
firstClassfunc1 (firstClassfunc2()); // Hey Medium.
[![Watch the video](https://i.ytimg.com/vi/m3svKOdZijA/sddefault.jpg)](https://www.youtube.com/embed/m3svKOdZijA?wmode=opaque&widget_referrer=https%3A%2F%2Fmedium.com%2Fdatadriveninvestor%2Fjavascript-currying-vs-partial-application-4db5b2442be8&enablejsapi=1&origin=https%3A%2F%2Fcdn.embedly.com&widgetid=1)

Curry Factory Method(ES6)

const compose = (…fns) =>
  fns.reduce((f, g) => (…args) => f(g(…args)));

Here μ—¬κΈ° ES5λ₯Ό μ‚¬μš©ν•˜μ—¬ 자체 컀링 νŒ©ν† λ¦¬ ν•¨μˆ˜λ₯Ό λ§Œλ“œλŠ” 방법에 λŒ€ν•œ 쒋은 기사.

Partial Application

ν•¨μˆ˜μ— μ—¬λŸ¬ 인수λ₯Ό κ³ μ •ν•˜μ—¬ 더 μž‘μ€ 인수의 λ‹€λ₯Έ ν•¨μˆ˜, 즉 ν•¨μˆ˜ 체인이 진행됨에 따라 ν•˜λ‚˜ μ΄μƒμ˜ μΈμˆ˜μ— 값을 λ°”μΈλ”©ν•˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό μƒμ„±ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€.

function add1(x) {  
  return 1 + x;  
}

JavaScriptμ—λŠ” μ—¬λŸ¬ 개의 μΈμˆ˜κ°€μžˆλŠ” ν•¨μˆ˜μ—μ„œ μž‘λ™ν•˜λŠ” μž„μ˜μ˜ μ–‘μ˜ 맀개 λ³€μˆ˜λ₯Ό 바인딩 ν•  μˆ˜μžˆλŠ” λ‚΄μž₯ λ©”μ†Œλ“œ .bindκ°€ μžˆμŠ΅λ‹ˆλ‹€. 호좜의 ꡬ문은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

function.bind(_thisValue_, [_arg1_], [_arg2_], ...)

이 ν•¨μˆ˜λŠ” μ•”μ‹œμ μΈ 이 맀개 λ³€μˆ˜κ°€ 초기 인수둜 항상 μ§€μ •λœ μƒˆ ν•¨μˆ˜λ‘œ λ°”λ€λ‹ˆλ‹€.

function addition(x, y) {  
   return x + y;  
}

const plus5 = addition.bind(null, 5)  
plus5(10) // output -> 15

μ°Έκ³  : this 값은 (λ©”μ†Œλ“œκ°€ μ•„λ‹Œ) ν•¨μˆ˜ 좔가에 μ€‘μš”ν•˜μ§€ μ•ŠμœΌλ―€λ‘œμ΄ 값이 nullμž…λ‹ˆλ‹€.

λ°‘μ€„μ΄λ‚˜ lodashλ₯Ό μ‚¬μš©ν•  λ•Œ 이 bind λ©”μ†Œλ“œλ³΄λ‹€ 훨씬 쒋은 partial ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ partial μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž¨ 및 μ™Όμͺ½, 였λ₯Έμͺ½ partial μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž¨ κΈ°λŠ₯ κ΅¬ν˜„μ— λŒ€ν•œ μžμ„Έν•œ κ²Œμ‹œλ¬Ό Hereμž…λ‹ˆλ‹€.

Difference

  • 컀링은 항상 쀑첩 된 단항 (1 μ°¨) κΈ°λŠ₯을 μƒμ„±ν•©λ‹ˆλ‹€. λ³€ν™˜ 된 ν•¨μˆ˜λŠ” μ—¬μ „νžˆ 원본과 λ™μΌν•©λ‹ˆλ‹€. (원본 ν•¨μˆ˜λŠ” μ—¬μ „νžˆ ν•΄λ‹Ή μΈμžλ“€μ˜ 갯수λ₯Ό μ›ν•©λ‹ˆλ‹€. )
  • partial μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μž„μ˜μ˜ 수의 인수 ν•¨μˆ˜λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. λ³€ν™˜ 된 ν•¨μˆ˜λŠ” μ›λž˜ ν•¨μˆ˜μ™€ λ‹€λ¦…λ‹ˆλ‹€. μΈμˆ˜κ°€ 더 μ μŠ΅λ‹ˆλ‹€.
  • 컀링은 partial μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ•„λ‹™λ‹ˆλ‹€. partial μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§Žμ€ 수의 인수λ₯Ό μ·¨ν•˜λŠ” ν•¨μˆ˜λ₯Ό 컀링 ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (인수의 수λ₯Ό μˆ˜μ •ν•˜μ§€ μ•ŠλŠ” ν•œ).

Advantages

보닀 좔상적인 κΈ°λŠ₯의 μž¬μ‚¬μš©μ΄ μ‰¬μ›Œ μ½”λ“œκ°€ 깨끗 해지고 λ³΅μž‘μ„±μ΄ 쀄어 μ½”λ“œ ν‘œν˜„λ ₯κ³Ό μœ μ§€ 관리 성이 ν–₯μƒλ©λ‹ˆλ‹€.

이 κΈ°μ‚¬μ˜ 일뢀 λ¦¬μ†ŒμŠ€λ₯Ό μ°Έκ³ ν–ˆμŠ΅λ‹ˆλ‹€.