이전 포스트에서 이어지는 내용입니다.
"monad" 태그로 연결된 4개 게시물개의 게시물이 있습니다.
모든 태그 보기Typescript로 확률 Monad 구현하기 - 1
최근에 Probability Monads from scratch in 100 lines of Haskell 글을 읽어보았는데 내용이 꽤 재밌어서 Typescript로 구현한 과정을 소개하고자 한다.
해당 글은 haskell을 사용해 확률분포를 표현하는 Monad를 만들어서 간단한 확률을 구하는 과정을 담고있다.
보통 순수 함수형 언어에서 주로 사용하는 Either
, State
같은 Monad 대신 언뜻 보기에는 관련이 없어보이는 확률분포 계산에 Monad를 활용하는 것이 신기했다.
그래서 나에게 조금 더 익숙한 언어인 Typescript로 구현해보았다.
모든 구현 코드는 Github에 올려두었다.
Promise와 Monad - 2
이전 글에서는 promise 를 반환하는 함수들을 then 을 이용해 합성하는 과정을 살펴보았다.
이제 파라미터를 2개 이상 요구하는 함수가 있는 경우를 살펴보자.
Promise와 Monad - 1
예전 node.js
의 많은 비동기 함수는 결과를 함수로 받는 콜백형태로 이루어져 있었다.
이로인해 여러 비동기 로직을 순차적으로 실행하는 코드를 보면 일명 Callback Hell
이라는 것을 볼 수 있다.
asyncA((a) => {
asyncB((b) => {
asyncC((c) => {
asyncD((d) => {
return a + b + c + d;
});
});
});
});
이후 이를 해결하는 방안으로 여러 라이브러리나 기술들이 나왔으나 지금은 주로 promise
와 async/await
를 활용한다.
사실 나는 angular
를 통해 js 를 본격적으로 사용했기에 비동기 처리를 rxjs
의 observable
을 사용해왔다.
하지만 백엔드 개발자가 된 이후로 api 를 개발하는데 사용하는 대부분의 함수가 promise
를 반환하다보니 observable
을 활용하지 않게되었다.
promise
를 본격적으로 사용했을 때에는 이미 async/await
가 도입된 이후였고 동기적으로 보이는 코드를 작성하는데 큰 어려움 없었다.
그래서 굳이 then
이나 catch
구문을 사용할 필요가 없다고 생각했었다.
그러나 함수형 패러다임을 공부하면서 함수의 합성, 선언적인 코드, pointfree 에 대한 매력을 느꼈고 이를 then chaining
을 통해 이룰 수 있다는 것을 깨달았다.
함수형 패러다임 중 난해한 monad
도 promise
와 비교하면서 생각하니 이해하는데 많은 도움을 받았다.
그래서 이와 관련한 글을 작성하려고 한다.