Source: https://youtu.be/jd5e71nFEZM
Functor, Monad, Transformer를 아주 다양한 예제로 설명해주는 좋은 영상이다.
Functor
문제상황
Future
와List
과 겹쳐져 있음- 두번의 map을 쓰는게 마음에 들지 않음
1 |
|
해결법: Functor
Functor
는map
을 가지고 있다.map
은 Wrapper 객체를 대상으로 한다.map
은 Wrapper의 내용만 다른 타입/값으로 변경한다.
1 |
|
Monad
문제 상황
- 두번의 Future가 겹치는 상황에서 해결 불가능
- 겹치는 연산을 하나로 합성해줄 필요가 있음
A => Future[B]
+B => Future[C]
를 합쳐서A => Future[C]
로 만들고싶음
1 |
|
해결법: Monad
Monad
는id
,map
,flatmap
3가지를 가지고 있다.- 즉 위 상황을 깔끔하게 해결해준다.
Future
는 모나드이다. for
를 쓰면 monad를 더 깔끔하게 풀 수 있다.
1 |
|
중쳡된 Monad
문제상황
- 실제 개발에서는 Option이 포함되기 마련
- 두 다른 Monad인
Future
와Option
이 겹침
1 |
|
- 서로 다른 두 Functor는 중첩할 수 있다.
FunctorB.compose(FunctorA)
는 또다른 Functor이다.
- 서로 다른 두 모나드는 중첩할 수 없다. 왜?
- flatMap을 위한 로직을 알 수 없기 때문
Future[Option[String]]
을 flatMap한다고 하자.- flatMap의 인자는
Option[String]
이 된다. - 이걸
String => Future[Option[String]]
에 넣어야 한다. - 결국
Option
의 까는 로직을 알야하 한다.
해결방법: Transformer!
- flatMap 로직을 내장하고 있는 Transformer를 따로 구현하자.
OptionT[Future, String]
이라고 하면- 실질적으로는
Future[Option[String]]
인 것을 뜻한다. - 단 flatMap이 된다는것이 다르다.
- 실질적으로는
1 |
|