Curry And Compose (why you should be using something like ramda in your code) - Lee-hyuna/33-js-concepts-kr GitHub Wiki
Curry And Compose (why you should be using something like ramda in your code)
ν¨μν νλ‘κ·Έλλ°μ κ΄ν΄μλ μ£Όμ νΉμ§μ κ²°ν©μ±, κΈ°μ‘΄ ν¨μλ₯Ό κ²°ν©ν΄μΌλ§ μλ‘μ΄ ν¨μλ₯Ό μμ±νλ κ² μ λλ€.
μλ₯Ό λ€μ΄, νΉμ 쑰건μμ μ°Έμ λ°ννλ ν¨μλ₯Ό μ¬μ©νκ³ νν° ν¨μμ κ²°ν©νμ¬ μ¬μ¬μ©νμ¬ λ°°μ΄μμ μμ΄ν μ μ νν μ μμ΅λλ€.
κ·Έλ¬λ μλ°μ€ν¬λ¦½νΈμμ λ€μκ³Ό κ°μ λͺκ°μ§ κΈ°λ₯μ΄ μμ±λ μ μμ΅λλ€.
var isGreaterThan = function(limit) {
return function(value) {
return value > limit;
};
};
μ΄ μμ μμλ λ€λ₯Έ ν¨μλ₯Ό λ§λλ ν¨μκ° μ‘΄μ¬ν©λλ€. 첫λ²μ§Έλ λ¨μ§ value, limitμ κ²°ν©νλλ° μ¬μ€ λΉκ΅κ° λ°μνκ³ , booleanμ λ°ννκ³ λ λ€μμ λλ²μ§Έλ₯Ό λ°νν©λλ€. μ΄ ν¨μλ curryλ ννμ λλ€. μ¦, νλμ λ¨μΌ μΈμλ₯Ό κ°μ Έμμ κ°μ λ°ννλ ν¨μ μ λλ€. κ°μ κ³μ°νκΈ° μν΄ λ λ§μ μΈμκ° νμν κ²½μ° λͺ¨λ ν¨μκ° μ λ¬λ λκΉμ§ λ€μ μΈμλ₯Ό μ·¨νλ λ€λ₯Έ ν¨μλ₯Ό λ°νν©λλ€. μ΅μ’ κ²°κ³Όκ° κ³μ°λμ΄μ§λλ€.
ES6μ νμ΄ν ν¨μ ꡬ문μ μ¬μ©νλ©΄ ν¨μ¬ λ κ°νΈνκ² μμ±ν μ μμ΅λλ€.
var isGreaterThan = (limit) => (value) => value > limit;
μμ§ ES6λ₯Ό μ¬μ©νμ§ μλ κ²½μ°μλ νλ κ°μ μ°μν ν΄κ²°λ°©λ²μΈ lodashβs _.curryμ μ¬μ©νκ±°λ ramdaβs R.curry(HTTPμ²λΌ)μ μ¬μ©νλ κ²μ λλ€. μ΄ ν¨μλ€μ΄ νλ μΌμ μ¬λ¬ κ°μ μΈμ ν¨μλ₯Ό μ·¨νκ³ κ·Έκ²μ curryμ λ²μ Όμ λ°ννλ κ²μ λλ€.
//Using ramda's curry
var isGreaterThan = R.curry(function(limit, value) {
return value > limit;
});
μ΄ λ§μ§λ§ ννμ μμ μ½λλ₯Ό μ¬μ©νλ©΄ μ¬μ ν λ κ°μ§ μΈμλ₯Ό μ λ¬ ν μ μλ€λ μ΄μ μ΄ μμΌλ©° μλν©λλ€.
greaterThan(10)(20); //true
greaterThan(10, 20); //true
var greaterThanTen = greaterThan(10);
greaterThanTen(20); //true
curry ννλ₯Ό μ¬μ©νλ©΄ ν©ν 리 ν¨μμ κ°μ κ²μ΄ μμΌλ©° dataλ₯Ό μ λ¬ νκ³ κ²°ν©μ μ¬μ©ν ν¨μλ₯Ό λ°μ λ€μ κ°μ μ λ¬ν©λλ€. Hey Underscore, Youβre Doing it Wrong μμ μ²λΌ λ°μ΄ν°λ₯Ό λ§μ§λ§μΌλ‘ μ λ¬νκ³ , μ§μν΄μΌν κ°μ λ¨Όμ μ λ¬ ν΄μΌν©λλ€.
νν° κΈ°λ₯μ μλ‘ λ€μ΄ λ³΄κ² μ΅λλ€. locashμμλ collectionμ 첫λ²μ§Έ μΈμλ‘ μ·¨ν λ€μ, λ λ²μ§Έλ‘ νν°λ§νλ ν¨μλ₯Ό μ¬μ©ν©λλ€. λ°μ΄ν°λ₯Ό λ¨Όμ μ λ¬νλ―λ‘ μλμμ λ³Ό μ μλ―μ΄ λ€λ₯Έ κΈ°λ₯μ μμ±νκΈ° λ μ΄λ ΅μ΅λλ€.
//Using lodash here.
//We flip the order of the arguments in the filter
//function, passing the data last, and curry it.
var filter = _.curry(function(fn, collection) {
return _.filter(collection, fn);
});
μ΄μ λμ±λ κ²°ν© κ°λ₯ν νν° κΈ°λ₯μ΄ μ‘΄μ¬νκ³ , μνλλλ‘ μ½κ² λ ν¨μλ₯Ό κ²°ν©ν μ μμ΅λλ€.
var onlyPositives = filter(greaterThan(0));
onlyPositives([-1, 4, 2, -5]); // [4, 5]
μ΄κ²μ ν΅μ¬μ μΈ ν¨μ μ λλ€. μ΄κ²μ΄ λ°λ‘ λλ€κ° map λ° filterμ κ°μ κΈ°λ³Έ ν¨μλ‘ μννλ μμ μ λλ€. λ§μ§λ§ μ‘°μΉλ‘λ λ°μ΄ν°λ₯Ό λ§μ§λ§μΌλ‘ μ λ¬νκ³ ν¨μλ₯Ό μ¬μ©νμ¬ μ¬λ¬ ν¨μλ₯Ό κ²°ν©νλ€λ μ¬μ€μ νμ©νλ κ²μ λλ€. μΈλλ°, locash λ° λλ€λ κ·Έκ²μ κ°μ§κ³ μμΌλ©°, λͺ¨λ λΉμ·ν©λλ€. λ§μ ν¨μλ₯Ό μ λ¬νκ³ ν ν¨μμ κ²°κ³Όλ₯Ό λ€μ ν¨μμ μΈμλ‘ μ λ¬νκ³ , λ§μ§λ§ ν¨μμ κ²°κ³Όλ₯Ό λ°ννλ ν¨μλ₯Ό λ°νν©λλ€. μ€λ₯Έμͺ½μΌλ‘ μΌμͺ½μΌλ‘ ~
//read from bottom to top
//+ getFirstPositivePlusOne :: [Number] => Number
var getFirstPositivePlusOne = R.compose(
R.add(1), // 4
R.get(0), // 3
filter(greaterThan(0))); // [3, 6]
getFirstPositive([-2, -1, 3, 6]); // 4
λ°μ΄ν°-λ§μ§λ§μΌλ‘ curryλ ν¨μλ₯Ό composeμ κ²°ν©νλ κ²λ§μΌλ‘ ν¨μ¬ λ κ°κ²°νκ³ ν©λ¦¬μ μΈ μ½λμ μμν ν¨μλ₯Ό λͺ¨λ μμ±ν μ μμΌλ©°, λλ€κ° νλ κΈ°λ₯, _μ lodashκ° μλͺ»νκ³ μμ΅λλ€. κ·Έκ²μ μ μ νκ² curryλ λͺ κ°μ§ κΈ°λ₯μ μ 곡νλ―λ‘ point free wayλΌκ³ λΆλ¦¬λ μ΄ λ°©λ²μΌλ‘ μμ±ν μ μμ΅λλ€. point free codeλ λ€μκ³Ό κ°μ΄ "glue"λ³μλ₯Ό μ μΈνμ§ μλ μ½λ μ λλ€.
//lodash way
var onlyPositives = function(data){ //glue variable (data)
return data.filter(function(item) { //glue variable (item)
return greaterThan(0, item);
});
}
//pointfree ramda way
var onlyPositivesPF = R.filter(greaterThan(0)); //no glue variables
μ½λμ μ ν λ¬Έμ κ° μλ κ²½μ°μλ μ΄λ₯Ό μννλ©΄ μμ©κ΅¬ μ½λμ λ§μ λΆλΆκ³Ό λΆνμν λ³μλ₯Ό λλΆλΆ μ κ±°νμ¬ λ μκ³ κ°κ²°ν μ½λλ₯Ό μμ±ν μ μμΌλ©° κ²°ν¨μ΄ μμ λ λ²κ·Έμ λ²κ·Έλ₯Ό μ½κ² μλ³ν μ μμ΅λλ€.