PHpullh
학습 라이브러리/Kotlin/모나드 패턴 (Monad Pattern)

KOTLIN · 함수형

모나드 패턴 (Monad Pattern)

모나드는 값을 감싸고 flatMap으로 연쇄 연산을 수행하는 패턴입니다. Kotlin에서 Maybe/Option 모나드를 구현합니다.

함수형고급monadmaybeflatMapfunctional-pattern

핵심 설명

모나드는 값을 감싸고 flatMap으로 연쇄 연산을 수행하는 패턴입니다. Kotlin에서 Maybe/Option 모나드를 구현합니다.

Kotlin code

sealed class Maybe<out T> {
    data class Just<T>(val value: T) : Maybe<T>()
    data object None : Maybe<Nothing>()

    fun <R> map(f: (T) -> R): Maybe<R> = when (this) {
        is Just -> Just(f(value))
        is None -> None
    }

    fun <R> flatMap(f: (T) -> Maybe<R>): Maybe<R> = when (this) {
        is Just -> f(value)
        is None -> None
    }

    fun getOrElse(default: @UnsafeVariance T): T = when (this) {
        is Just -> value
        is None -> default
    }
}

fun findUser(id: Int): Maybe<String> =
    if (id > 0) Maybe.Just("User-$id") else Maybe.None

fun findEmail(user: String): Maybe<String> =
    Maybe.Just("$user@example.com")

fun main() {
    val email = findUser(1)
        .flatMap { findEmail(it) }
        .map { it.uppercase() }
    println(email)  // Just(USER-1@EXAMPLE.COM)

    val none = findUser(-1)
        .flatMap { findEmail(it) }
    println(none)   // None
}

학습 팁

실무에서는 Kotlin의 nullable 타입이 Maybe/Option의 역할을 대부분 수행합니다. 더 복잡한 모나드가 필요하면 Arrow 라이브러리를 사용하세요.

주의할 점

flatMapmap을 혼동하지 마세요. map은 값을 변환하고, flatMap은 변환 결과가 다시 Maybe인 경우 사용합니다.

자주 묻는 질문

모나드 패턴 (Monad Pattern)란 무엇인가요?

모나드는 값을 감싸고 flatMap 으로 연쇄 연산을 수행하는 패턴입니다. Kotlin에서 Maybe/Option 모나드를 구현합니다.

모나드 패턴 (Monad Pattern) 학습 시 주의할 점은 무엇인가요?

flatMap 과 map 을 혼동하지 마세요. map 은 값을 변환하고, flatMap 은 변환 결과가 다시 Maybe인 경우 사용합니다.