함수형 프로그래밍

·2021년 11월 22일
0

Study

목록 보기
9/20

함수형 프로그래밍의 특징

1) Pure Functions 순수 함수

let num = 1;

function add(a) {
	return a + num;
}   => (X)
function add(a, b) {
	return a + b;
}	=> (O)

: 함수에서 외부 상태값을 참조하거나, 외부의 상태를 변경하는 것은 순수함수라고 볼 수 없다.
: 동일한 인자를 넣었을 때, 항상 동일한 결과값을 반환하고
: 언제 선언이 되었는 지, 외부에 전혀 영향을 받지 않아야 함.
-> 함수 안에서 외부의 상태값을 변경한다면 그건 함수형 프로그래밍이 아닌 절차지향적 프로그래밍일 가능성 높음

2) stateless, Immutability 비상태, 불변성

let person = { name: 'dyung', age: 20 }

function increaseAge(person) {
	person.age = person.age + 1;
    return person;
}	=> (X)
const person = { name: 'dyung', age: 20 }

function increaseAge(person) {
	return { ...person, age: person.age + 1 };
}	=> (O)

: 비상태, 불변성을 유지해야 함
: 함수에 전달된 인자를 변경하는 것은 절대 함수형 프로그래밍이 아님
: 함수형 프로그래밍은 전달된 인자를 변경하는 것이 아니라 새로운 오브젝트를 만들어서 결과값으로 전달해야하는 것
: 외부의 상태나 함수의 인자로 전달된 데이터 상태를 변경하지 않음으로서 사이드 이펙트를 만들 지 않음으로서 불변성을 유지
-> 여러가지 동시다발적인 멀티 스레딩 환경에서도 안정적으로 동작 가능

3) Expressions Only! not statements like if, switch, for ...

let numbers = [1, 2, 3];

function multiply(numbers, multiplier) {
	for(let i = 0; i < numbers.length; i++) {
    	numbers[i] = numbers[i] =* multiplier;
    }
}	=> (X)
function muliply(numbers, multipliers) {
	return numbers.map(num => num * multiplier);
}

: if, switch, for과 같은 여러가지 문장을 사용하는 것은 함수형 프로그래밍이 아님

4. First-class and higher-order functions

//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]); > (4) [6, 8, 10, 12]
// higher-order functions

const addTwoppings = topping => food => food + topping;
const egg = addToppings('🍳');
const bacon = addToppings('🥓');

console.log(egg('🥘')); > 🥘🍳
console.log(bacon('🥪')); > 🥪🥓

: 함수를 변수에 할당하거나 함수에 인자로 전달하거나, return 하는 등의 일을 할 수 있는 first class 특징과
: 함수 자체를 인자로 전달하거나
: 함수에서 또 다른 함수를 리턴하는 higher-order function
: 두 가지의 속성을 가지고 있어야 함

profile
HAPPY !

0개의 댓글