# 함수형 프로그래밍
# 함수형 프로그래밍이란?
- 순수한 함수. 외부의 값에 접근하지 않아야 한다. 인자만 가지고 조물조물. 공유된 상태와 변경 가능한 데이터 및 부작용을 피하여 소프트웨어를 작성하는 프로세스.
- 애플리케이션의 상태가 공유되는 OOP랑은 대조된다.
# High Order Functions(HOC, 고차 함수)
- 다른 함수를 인자로 사용하거나 함수를 반환하는 함수. (또는 둘 다)
- 사용 예시
- 비동기 등 제어를 추상화한다 (콜백함수, promise 등을 사용)
- 다양한 데이터 유형에 대해 작동할 수 있는 유틸리티를 생성
const numbers = [1,2,3,4];
const isEven = x => !(x % 2); // '배열'을 처리하는 로직이 필요 없으며, 배열을 순환하며 재사용된다.
const evenNumbers = numbers.filter(isEven);
# Currying (커링)
여러 인자를 받는 함수에서 인자를 각각 하나씩 사용하여 함수 순서를 변환. 람다 표현식과 클로저로 구현.
// Not curried function
function sumOfThree(x, y, z) {
return x + y + z;
}
// Curried function
function sumOfThreeNew = (x) => {
return (y) => {
return (z) => {
return x + y + z;
}
}
}
sumOfThreeNew(1)(2)(3); // 6
// 간단 표기
function SumOfThreeSimple = x => y => z => x + y + z;
# Auto-currying
lodash와 Ramda는 curry
메소드를 가지고 있다. 이는 여러개의 인수를 가지는 함수를 커링된 함수로 만들어줌.
// Use lodash or ramda
const curry = _.curry || R.curry
const add = (x, y) => x + y;
const curriedAdd = curry(add);
curriedAdd(1)(2) // 3
curriedAdd(1) // (y) => 1+ y
curriedAdd(1, 2) // 3
# Function composition (합성함수)
두 가지 이상의 함수가 합성됨.
두 함수 f와 g가 있고 f(g(x))
와 같이 사용된다 할 때, 이를 f ∘ g(x)
와 같이 표현 가능.
아이고 헷갈려.
const compose = (f, g) => {
return (x) => {
return f(g(x));
}
};
// simple version
// const compose = (f, g) => x => f(g(x));
const add = x => y => x + y;
const pow = x => y => y ** x;
const addTwo = add(2); // (y) => y + 2
const square = pow(2); // (y) => y ** 2
const addTwoThenSquare = compose(square, addTwo);
addTwoThenSquare(10); // (10 + 2) ^ 2
// 인자에 2를 더하는 addTwo함수의 결과를 인자를 제곱하는 square함수
# Point free notation
함수를 작성할 때 매게변수를 정의하지 않는 것. 함수를 간결하게 해준다.
const map => fn => list => list.map(fn)
# Refer
- https://wonism.github.io/what-is-fp/
- https://flaviocopes.com/javascript-functional-programming/