걍 함수체이닝할때 리턴해주려면
각함수에서 뭘받는지 알아야하잖음?
그리고 예외거나 널값이나 할때 체이닝 중단해야 하잖아?
이때쓰는거임

모나드에 감싸놓으면 아무일도 안생기거나
어떤일이 생기게 할 수 있는 박싱된 객체같은거임

예를들어 무인수함수 f, g, h세개가
f(g(h(x)))모양으로 합성되어있다고하면

매개변수 p0을 받으면
h가 p0을 받아서 실행되고 p1을 리턴함
g가 p1을 받아서 실행되고 p2를 리턴함
f가 p2를 받아서 실행되고 최종결과를 리턴함

이때 g가 널을 리턴하면 함수진행을 멈추고싶음
근데 이미 합성된 함수라 멈출수가 없고
f로 널이 들어가서 이상한값이되거나 익셉션이 터지겠지?

이렇게 끝내고싶지 않을때 자바에서는 Optional클래스를 쓰잖아?
래퍼클래스로 감싸진채로는 f에 들어가도 아무일도 안생김

최종 결과값 받아서 
isPresent로 그대로 null을 리턴하거나 
orElse orElseGet같은거 쓰면 원하는 처리 할 수 있음

이게 모나드 끝임ㅋㅋ 걍 이렇게 쓰는거임

이게 종류별로 있는거임
Optional이나 Maybe가 널값들어올때 감싸주는 모나드고
Try가 익셉션일때 감싸주는 모나드고
Promise가 비동기일때 감싸주는 모나드임

모나드가 수학에서는 ㅈㄴ 어려운거일지 몰라도
프로그래밍에서는 원하지 않는 결과가 생길때를 대비해서
이상한값일때 다음함수에 들어가서 이상한짓 안하게 하려고 있는거임