방대한 데이터를 빠르게 계산해서 병렬적으로 안정적으로 처리하는 것의 중요성이 부각되면서 함수형 프로그래밍 언어가 부각되기 시작됐다.
// x let num = 1; function add(a) { return a + num; } // pure functions function add(a, b) { return a + b; } const result = add (2, 3);
// x let person = { name: 'hannah', age: 20 }; function increaseAge(person) { person.age = person.age + 1; return person; } // Stateless, Immutability const person = { name: 'hannah', age: 20 }; function increaseAge(person) { return { ...person, age: person.age + 1 }; }
// x statements let numbers = [1, 2, 3]; function multiply(numbers, multiplier) { for (let i = 0; i < numbers.length; i++) { numbers[i] = numbers[i] * multiplier; } } // Expressions function multiply(numbers, multiplier) { return numbers.map(num => num * multiplier); }
// 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])); // [6,8,10,12] // higher-order functions const addToppings = topping => food => food + topping; const egg = addTopping('🍳'); const bacon = addTopping('🥓'); console.log(egg('🥘')) //🥘🍳 console.log(bacon('🥪')) //🥪🥓
객체지향 프로그램이 비슷한 로직을 클래스로 묶어 나가는 것이 아닌 추상화, 캡슐화, 다형성 그리고 다양한 디자인패턴에 대해 공부하듯이 함수형 프로그래밍을 제대로 이해하기 위해서는 Monad, Semigroup, Applicative, Monaid, Functor, Disjunction등 다양한 컨셉들에 대해 잘 이해해야 진정한 함수 프로그래밍을 구현할 수 있다.
두가지를 비교하는것은 아파트 vs 하우스, 배 vs 비행기 정도의 차이처럼 가고자 하는 목적지 / 목표에 따라서 적절한 것을 고르거나 여러가지를 병합해서 사용하면 된다.
ex) UI어플리케이션 특성상 많은 상태변화가 일어나기 때문에 순수 함수형 프로그래밍으로는 힘들수가 있다.
→ 함수형과 반응형이 결합된 함수형 반응형 프로그래밍을 이용하거나 객체지향 프로그래밍에 함수형 프로그래밍을 더해 좀더 안정적인 프로그래밍을 할 수 있다.
프로그래밍 패러다임은 어느 하나가 다른 하나를 대체하는게 아니라 원하는 목표에 따라 적절한 걸 골라 사용한다.
참조: [드림코딩] 함수형프로그래밍이 대세다?! (함수형 vs 객체지향)