함수형 프로그래밍은 수학적 함수의 계산을 통해 자료를 처리하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임 중 하나다.
함수형 프로그램은 수학원리와 밀접하게 연관되어 있다. 배우는데 시간이 오래걸림
그래서 사람의 사고와 가까운 절차지향,객체지향을 조금더 선호한다.
하지만 요즘 AI,IOT,빅데이터,비트코인 뜨면서 방대한 데이터를 빠르게 계산해서 병렬적으로
안정적으로 처리하는 것이 중요해지기 시작했다.
함수에서 외부의 상태값을 참조하거나 또는 외부의 상태를 변경하는 것은 순수함수가 아니다.
동일한 인자를 넣었을때, 동일한 값을 반한한다.
// 순수 함수가 X
let count =1
function sum(a){
return a + count
}
// 순수함수
function sum(a,b){
return a + b
}
const result = sum(1,2)
console.log(result)
인자로 전달된 데이터를 변경하는 것은 절대 함수형이 아니다.
함수형 프로그램에서는 전달된 데이터를 변경 불가
새로운 버전의 , 새로운 오브젝트를 만들어서 사용하고 결과값을 전달 한다
let person = {name:"사람",age:10};
function addAge(person){
person.age = person.age + 1;
return person
}
// Stateless, Immutability
const person={name:"사람1",age:20};
function addAge(person){
return {...person, age: person.age + 1
}
}
console.log(person,"확인중")
함수형 프로그래밍 에서는 If나 Switch 사용안하고 프로그래밍을 해야 한다.
// for loop
let num = [1,2,3]
function sum(num,total){
for(let i=0; i < num.length; i++){
num[i] *= total
console.log(num[i])
}
}
sum(num,3)
// Expressions
function sum1(num,total){
return num.map((item)=> item * total)
}
sum1(num,3)
다른데이터와 마찬가지로 함수를 변수에 할당하거나. 함수에 인자로 전달하거나 리턴하는 등의 일을 할수 있는 First-Class (일급함수) 특징과 그리고 함수 자체를 인자로 전달하거나 함수에서 또 다른 함수를 리턴하는 고차 함수 특징을 가지고 있어야 한다.
// 일급 함수
const addTwo = a => a + 2;
const mulTwo = a => a * 2;
const transForm = numbers => numbers.map(addTwo).map(mulTwo);
console.log(transForm([1,2,3,4]))
// 고차함수
const addToppings = topping => food => food + topping;
const egg = addToppings('egg')
const bacon = addToppings("bacon")
console.log(egg("bacon"))
console.log(bacon("egg"))