[ Condition: 함수형 프로그래밍이 되기위한 조건 ]
1. Pure Function
let num = 1;
// Pure Function (X)
function add(a) {
return a + num;
}
// Pure Function (O)
function add(a, b) {
return a+b;
}
const sum_result = add(1,2);
* 외부에 있는 값을 참조하거나, 외부의 상태값을 변경 (X)
>>> "Pure 위반, 함수형 프로그래밍에 어긋남"
2. Stateless, Immutability (비상태, 불변성 유지)
let person = { name: 'ukjae', age: 35 }
// Stateless, Immutability(X)
function increaseAge(person) {
person.age = person.age+1;
return person;
}
// Stateless, Immutability(O)
function increaseAge(person) {
return {...person, age: person.age+1 };
}
* 함수로 전달된 인자 자체를 변경하는 것이 아니라, 새로운 결과값을 만들어서 전달해야 한다.
>>> "Stateless Immutability 위반, 함수형 프로그래밍에 어긋남"
* SideEffect(부작용)
* Object.freeze(); 함수를 통해서 대상을 불변의 상태로 만들수 있다.
>>> Cf). const person = Object.freeze({name: 'ukjae', age: 34});
3. Expressions Only (Not Statements like if, switch, for ... )
let numbers = [1,2,3];
// Expressions Only(X)
function multiCalc(numbers, multiparter) {
for(let i=0; i<numbers.length; i++) {
numbers[i] = numbers[i] * multiparter;
}
}
// Expressions Only(O)
function multiCalc(multiparter) {
return numbers.map((num) => num * multiparter);
}
* 오직 표현식만 있어야한다. 내부적으로 if, switch, for문 과같은 반복문 제어문 사용X
>>> "Expressions Only 위반, 함수형 프로그래밍에 어긋남"
4. First-class and higher-order functions
// first-class (O)
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 = (food) => food + '고기'
const bacon = addToppings('핫 치킨');
--> bacon = (food) => food + '핫 치킨'
console.log(egg('콩')); --> "결과: 콩고기"
console.log(bacon('샌드위치')); --> "결과: 샌드위치 핫 치킨"
// 화살표 함수에서 함수를 리턴하는 고차원.. (익명함수)
const 함수명 = (변수) => { () => {} }
* 함수를 변수에 할당하거나, 함수를 인자로 전달하거나 리턴하는 등의 일들을 할 수 있는 First Class(일급함수)의 특징
* 또한, 함수자체를 인자로 전달하거나 함수에서 다른 함수를 리턴하는 고차함수 등이 함수형 프로그래밍의 조건
[ Recommend Resources ]
Monad, Semigroup, Applicative, Monaid, Functor, Disjunction
'Study' 카테고리의 다른 글
[ javascript && Python ] 알고리즘 챌린지 "Part2" (0) | 2023.01.29 |
---|---|
[ javascript && Python ] 알고리즘 챌린지 "Part1" (0) | 2023.01.17 |
[Flutter] 플러터 Exercise(2) (0) | 2022.05.24 |
[Flutter] 플러터 Exercise(1) (0) | 2022.05.15 |
[Linux 자격증 2차시험] Shell.(쉘) 정리 (0) | 2022.01.23 |