이 글은 책 Learn You a Haskell for Great Good 14장에 나오는 함수 join
에 대한 내용을 읽고 정리한 것입니다.
아래와 같이 어떤 모나드 값이 모나드 안에 있다면 어떻게 꺼낼 수 있을까?
Just (Just 9)
join
이라는 함수를 이용하면 가능하다.
join :: (Monad m) => m (m a) -> m a
함수 join
을 이용하면 아래와 같이 Maybe
안에 있는 Maybe
를 꺼낼 수 있다.
GHCi> join (Just (Just 9))
Just 9
그런데 아래와 같이 중간에 한번이라도 Nothing
이 포함되어 있으면 꺼낸 값도 Nothing
이 된다.
GHCi> join (Just Nothing)
Nothing
GHCi> join Nothing
Nothing
join
을 구현해보면 아래와 같다.
join :: (Monad m) => m (m a) -> m a
join mm = do
m <- mm
m
재밌는 점은 아래와 같은 식이 항상 성립한다는 것이다.
m >>= f = join (fmap f m)
그래서 직접 어떤 타입의 모나드 인스턴스를 구현할 때는 >>=
를 직접 생각해내기 보다는 그냥 join
을 이용하는 게 훨씬 편리하다.