π ν¨μν νλ‘κ·Έλλ°
1. ν¨μν νλ‘κ·Έλλ°μ΄λ??
- lambda calculus λΌλ μν μ΄λ‘ μμ λΉλ‘―λ μλ‘μ΄ νλ‘κ·Έλλ° ν¨λ¬λ€μ
- νμ§λ§ μ΄λ―Έ λ§μ νλ‘κ·Έλλ° μΈμμμ ν¨μνμΌλ‘ μ½λλ₯Ό μμ± ν μ μλ APIκ° μ΄λ―Έ μμ
- JSλ ES6λΆν° μ§μν¨, λ§μ½ Reactλ₯Ό μ¨λ΄€λ€λ©΄, μ΄λ―Έ ν¨μν νλ‘κ·Έλλ°μ κ²½νν΄λ΄€λ€κ³ ν μ μμ
λ¨Έ κ·Έλ°κ²λ€μ΄ μλ€κ³ ν©λλ€,,,
2. ν¨μν νλ‘κ·Έλλ° νΉμ§ 4κ°μ§
01. Pure Functions(μμν¨μ)
- λμΌν μΈμλ₯Ό λ£μμ λ, νμ λμΌν κ²°κ³Όκ°μ λ°νν΄μν¨
- μΈμ μ μΈλμλμ§ μΈλΆμ μ ν μν₯μ λ°μ§ μλλ‘ μμ± ν΄μΌν¨
- ν¨μ μμμ μΈλΆμ μνκ°μ λ³κ²½νλ€λ©΄, 그건 ν¨μνμ΄ μλ μ μ°¨μ§ν₯νμΌ κ°λ₯μ±μ΄ λ§€μ° λμ
// Bad
let num = 1;
function add(a) {
return a + num;
}
// Good
function add(a, b) {
return a + b;
}
const result = add(2, 3);
02. Stateless, Immutability
- λΉμν, λΆλ³μ ©μ μ μ§ν΄μΌν¨
- ν¨μμ μΈμλ‘ μ λ¬λ λ°μ΄ν°λ₯Ό λ³κ²½νλ κ²μ μ λ ν¨μν νλ‘κ·Έλλ°μ΄ μλ
- λ°μ΄ν°λ₯Ό μ§μ λ³κ²½νλ κ²μ΄ μλ, μλ‘μ΄ λ²μ μ μλ‘μ΄ μ€λΈμ νΈλ₯Ό λ§λ€μ΄μ κ²°κ³Όκ°μΌλ‘ μ λ¬
- μΈλΆμ μνλ ν¨μμ μΈμμ μ λ¬λ μνλ₯Ό λ³κ²½νμ§ μμΌλ―λ‘μ
side effect
λ₯Ό λ§λ€μ§ μμ - λ°λΌμ λΆλ³μ± μ μ§νλ©° μ¬λ¬ λ©ν° μ€λλ© νκ²½μμλ μμ μ μΌλ‘ λμ κ°λ₯
jsμμλ νΉν λΆλ³μ±μ λ°μ΄ν° νμ μ΄λΌλ κ²μ΄ λ°λ‘ μκΈ° λλ¬Έμ
Object.freeze
λΌλ ν¨μλ₯Ό μ¬μ©ν΄μ, λ³μλ₯Ό λΆλ³μ±μΌλ‘ λ§λ€μ΄ μ€ μ μμ
// Bad
let person = { name: "kim", age: 25 };
function increaseAge(person) {
person.age = person.age + 1;
return person;
}
// Good - Stateless, Immuablility
const person = { name: "kim", age: 20 };
function increaseAge(person) {
return { ...person, age: person.age + 1 };
}
// or... Object freeze
const person = Object.freeze({ name: "kim", age: 20 });
function increaseAge(person) {
return Object.freeze({ ...person, age: person.age + 1 });
}
03. Expressions Only!
if, for, switch
λ± μ¬λ¬κ°μ§ λ¬Έμ₯μ μ¬μ©νλ κ²μ ν¨μν νλ‘κ·Έλλ°μ΄ μλ
// Bad
let numbers = [1, 2, 3];
function multiply(numbers, multiplier) {
for (let i = 0; i < numbers.length; i++) {
numbers[i] = numbers[i] * nultiplier;
}
}
// Good
function multiply(numbers, multiplier) {
return numbers.map((num) => num * multiplier);
}
04. First-class and higher-order functions
- λ€λ₯Έ λ³μμ λ§μ°¬κ°μ§λ‘ ν¨μλ₯Ό λ³μμ ν λΉνκ±°λ
- ν¨μμ μΈμλ‘ μ λ¬νκ±°λ 리ν΄νλ λ±μ μΌλ€μ ν μμλ First Class(μΌκΈ ν¨μ) νΉμ§
- κ·Έλ¦¬κ³ ν¨μ μ체λ₯Ό μΈμλ‘ μ λ¬νκ±°λ, ν¨μμμ λ λ€λ₯Έ ν¨μλ₯Ό 리ν΄νλ κ³ μ°¨ν¨μ
- μ΄ λκ°μ§ νΉμ§μ κ°μ§κ³ μμ΄μΌ ν¨
// first-class
const addTwo = (a) => a + 2;
const multiplyTwo = (a) => a * 2;
const transform = (numbers) => numbers.map(addTwo).map(multiplyTwo);
console.log(transform([1, 2, 3, 4]));
// higher-order functions
const addToppings = (topping) => (food) => food + topping;
const egg = addToppings("egg");
const bacon = addToppings("bacon");
console.log(egg("eggtoast"));
console.log(bacon("toast"));
λ¨μν λΉμ·ν λ‘μ§μ ν΄λμ€λ‘ λ¬Άμ΄ λκ°λ κ²μ΄ μ§μ ν κ°μ²΄μ§ν₯μ΄ μλκ² μ²λΌ, μΊ μν, μΆμν, λ€ν₯μ±μ κ·Έλ¦¬κ³ μ¬λ¬ λμμΈ ν¨ν΄μ λν΄μ 곡λΆν΄ λκ°λ―μ΄ ν¨μν νλ‘κ·Έλλ°μ μ λλ‘ νκΈ° μν΄μλ
Monad, Semigroup, Applicative, Monaid, Functor, Disjunction
μ΄λ° λ€μν 컨μ λ€μ λν΄μ μ μ΄ν΄ν΄μΌλ§ ν¨
λκΈλ¨κΈ°κΈ°