Study

[Study] 함수형 프로그래밍 정리.

wookjae 2022. 6. 8. 12:58

[ 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