모나드는 함수형 프로그래밍에서 함수 합성을 안전하게 하기 위한 어떤 타입(?) 혹은 집합같은 것이다. (컨테이너 같은것)
우선 함수형 프로그래밍은 어떤 문제를 해결하기 위해 여러 방법(함수)들을 이용하여 해결하는 프로그래밍 기법이다.
두 함수 f: C -> B
와 g: B -> A
가 있을 때, f(g())
를 통해 A(결과)를 도출하겠다는 방식이 함수형 프로그래밍이다.
위와 같이 어떤 문제를 해결하기 위해 어떤 문제를 작은 함수(문제) 들로 보고 그 문제를 해결하기 위해 합성을 하여 결과를 도출하는 것이다.
이를 위해 필연적으로 함수 합성은 안전해야 하는데, 이를 도와주는 도구가 모나드이다.
JS에서 Array는 값이 없는 상황에 대한 합성을 안전하게 위해 Array를 사용할 수 있다.
const f = a => a + 1
const g = a => a + 2
[1].map(f).filter(g).forEach(console.log) // 값이 없어도 안전하게 합성되어 외부세계에 영향을 주지 않게 된다.
console.log(f(g())) // 값이 없으면 예상치 못한 값이 외부세계에 영향을 미친다.
Promise는 비동기에 대한 문제를 해결하기 위한 모나드이다.
Promise는 resolve, reject, 그리고 pending이 있다. 값을 대기하고 있는 상태에서 안전하게 함수 합성을 진행하도록 돕는다.
Promise.resolve(1).then(f).then(g).catch(console.log) // 어떤 값이 비동기적으로 들어와도 Pending 상태로 대기하게 된다.
함수형이 지향하는 바가 무엇이고, 어떤 문제를 해결하기 위해 나오게 됬는지 생각하게 된다.
https://teamdable.github.io/techblog/Moand-and-Functional-Architecture
https://www.inflearn.com/course/functional-es6/dashboard