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
-
컀리 ν¨μμ μΌλ°μ μΈ μ¬μ© μ¬λ‘λ ** ν¨μ κ΅¬μ± **μ λλ€ (μ :
p (x) = q (r (x))
). μ¦, μΈμλ₯Ό μ λ¬νμ¬ μ΄μ ν¨μμμ μ ν¨μλ₯Ό μμ±ν©λλ€. ν¨μq
λ ν¨μr
μ μΈμλ‘ λ°ν κ°μ λ°μ΅λλ€. ν¨μλ νλμ κ°λ§ λ°ν ν μ μμΌλ―λ‘ λ°ν κ°μ μ μ©λλ ν¨μλ λ¨νμ΄μ΄μΌ ν©λλ€. -
컀λ§λ ν¨μλ μΌλ° κΈ°λ₯μ μμ± ν μμλ λ§μ κ°λ₯μ±μ΄μλ νλ‘μ νΈμ ** μΈνλΌκ΅¬μ‘° μ€μ ** λμμλ μ¬μ©λ μ μμΌλ―λ‘ μμ μ‘°κ°μ μ½κ² ꡬμ±νκ³ μ¬μ¬μ© ν μ μμ΅λλ€.
-
Ramda.js λΌμ΄λΈλ¬λ¦¬. ν¨μλ μλμΌλ‘ 컀λ§λλ©° lodashμλ curryλΌλ ν¨μκ° μμΌλ©°μ΄ ν¨μλ μ»€λ§ κΈ°λ₯μ λ§λλ λ° μ¬μ©ν μ μμ΅λλ€.
-
Memoization μ»€λ§ ν¨μλ₯Ό μν λ€λ₯Έ μ’μ μΌμ΄μ€ μ λλ€.
-
Handling error μλ¬λ₯Ό λ°μμν€λ ν¨μμ νΈλ€λ§κ³Ό μλ¬ μ§ν μ¦μ μ’ λ£ μ²λ¦¬.
-
APIμμμ Catching multiple error and use it as a validator μ²λ¦¬μ ν΄λΌμ΄μΈνΈ μ¬μ΄λ μ½λ.
-
ν¨μλ₯Ό μΈμλ‘ λ°μμ κ·Έ κ°μ 리ν΄ν μ μλ 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
λ³΄λ€ μΆμμ μΈ κΈ°λ₯μ μ¬μ¬μ©μ΄ μ¬μ μ½λκ° κΉ¨λ ν΄μ§κ³ 볡μ‘μ±μ΄ μ€μ΄ μ½λ ννλ ₯κ³Ό μ μ§ κ΄λ¦¬ μ±μ΄ ν₯μλ©λλ€.
μ΄ κΈ°μ¬μ μΌλΆ 리μμ€λ₯Ό μ°Έκ³ νμ΅λλ€.