자바스크립트에서의 함수형 프로그래밍 모나드

boyeonJ·2023년 9월 4일
0
post-thumbnail

모나드는 함수 합성을 안전하게 해줍니다. 이를 위해서는 함수가 합성되는 시점의 상태를 확인합니다.

예를 들어 Array+map의 함수 합성에서는 그 시점에 array의 값이 있는지 확인한 후 함수 합성을 실행하고, Promise+then의 경우에는 비동기가 일어났는지 확인하고 함수 합성을 실행합니다.

모나드란?

모나드는 함수형 프로그래밍에서 자주 등장하는 디자인 패턴 입니다. 이는 프로그램 조각을 결합하고 반환 값을 추가 계산이 포함된 형식으로 래핑하는 구조입니다. 모나드는 함수 합성을 안전하게 해줍니다. 이를 위해서는 함수가 합성되는 시점의 상태를 확인합니다.

예를 들어 Array+map의 함수 합성에서는 그 시점에 array의 값이 있는지 확인한 후 함수 합성을 실행하고, Promise+then의 경우에는 비동기가 일어났는지 확인하고 함수 합성을 실행합니다.

일반 함수 합성과 비교

const f = (a) => a+2;
const g = (a) => a*a;

console.log(f(g())); //NaN

만약 위처럼 일반 함수 합성을 실행한다면 값이 없더라도 강제로 실행이 되어 NaN이 출력됩니다.

const f = (a) => a+2;
const g = (a) => a*a;

[].map(f).map(g).forEach((a)=>console.log(a)); // forEach 실행 안됨

모나드를 통해 구현할 경우 값이 없다면 map이 실행되지 않기 때문에 모나드의 상태를 변경하지 않습니다. 즉, 좀 더 함수 합성을 안전하게 수행할 수 있습니다.

Promise 모나드

위에서 설명했던것처럼 Array+map을 통해 구현하게 되면 모나드는 최초의 배열이 되며, Promise는 Promise객체가 모나드가 됩니다. 그 후에 Promise객체의 반환값의 상태를 통해 함수 합성을 수행합니다.

Promise.resolve(1).then(g).then(f).then(r=>log(r));

이미지 출처 : https://www.adit.io/posts/2013-04-17-functors,_applicatives,_and_monads_in_pictures.html

0개의 댓글