def map2[A,B,C](as: List[A], bs: List[B])(f: (A,B) => C): F[C] =
flatMap(fa)(a => map(fb)(b => f(a,b))
flatMap 가지고 map2 선언하면 이런 모양인데
val as = List(1, 2, 3, 4)
val bs = List(0, 2, 4, 8)
listMonad.map2(as, bs)(_ * _)
내가 바라는 거랑 다르게 길이 16개 짜리 리스트가 나옴.
코드를 잘 생각해보니 16개가 나오는 게 맞는 거 같음.
Monad에서 이렇게 정의하는 거로 알고 있었는데
제가 먼가 잘못 생각하고 있는 건가요
flatMap(fa)(a => map(fb)(b => f(a,b))
flatMap 가지고 map2 선언하면 이런 모양인데
val as = List(1, 2, 3, 4)
val bs = List(0, 2, 4, 8)
listMonad.map2(as, bs)(_ * _)
내가 바라는 거랑 다르게 길이 16개 짜리 리스트가 나옴.
코드를 잘 생각해보니 16개가 나오는 게 맞는 거 같음.
Monad에서 이렇게 정의하는 거로 알고 있었는데
제가 먼가 잘못 생각하고 있는 건가요
저게맞는데
님은 뭘생각했던건지 말해줘야 어디가 틀린지 말해주지
4개생각했으면 zipWith고 사실상 map의 동작임
map2가 온전히 모나드에서 나온게 아니라 모나드 하위타입의 ap을 갖고 인자가 2개인 함수를 lift해요
저 동작이 정 이해안가면 모나드가 아니라 applicative의 동작을 보면됨
Functor: 1개의 구조에 함수적용(map), Applicative: 여러개의 구조에 함수적용(map2)+값으로부터 구조생성(pure), Monad: Applicative+중첩구조 해체