PHpullh

PYTHON · 함수형

모나드 패턴

모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.

함수형고급monad모나드Maybe함수형

핵심 설명

모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.

Python code

from typing import TypeVar, Callable, Optional, Generic

T = TypeVar("T")
U = TypeVar("U")

class Maybe(Generic[T]):
    """None을 안전하게 처리하는 Maybe 모나드"""
    def __init__(self, value: Optional[T]):
        self._value = value

    @classmethod
    def of(cls, value: T) -> "Maybe[T]":
        return cls(value)

    def bind(self, func: Callable[[T], "Maybe[U]"]) -> "Maybe[U]":
        if self._value is None:
            return Maybe(None)
        return func(self._value)

    def map(self, func: Callable[[T], U]) -> "Maybe[U]":
        if self._value is None:
            return Maybe(None)
        return Maybe(func(self._value))

    def or_else(self, default: T) -> T:
        return self._value if self._value is not None else default

    def __repr__(self):
        return f"Maybe({self._value!r})"

# 안전한 딕셔너리 접근
def safe_get(d, key):
    return Maybe(d.get(key))

data = {"user": {"address": {"city": "서울"}}}
result = (
    Maybe.of(data)
    .bind(lambda d: safe_get(d, "user"))
    .bind(lambda d: safe_get(d, "address"))
    .bind(lambda d: safe_get(d, "city"))
    .map(str.upper)
    .or_else("Unknown")
)
print(result)  # 서울 → SEOUL

학습 팁

Maybe 모나드는 중첩된 if x is not None: 체크를 우아하게 대체합니다.

주의할 점

모나드 패턴을 남용하면 Python의 관용적 스타일과 맞지 않아 다른 개발자가 이해하기 어려워집니다.

자주 묻는 질문

모나드 패턴란 무엇인가요?

모나드 패턴으로 None 체크, 에러 처리 등을 체이닝 가능한 형태로 추상화합니다.

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

모나드 패턴을 남용하면 Python의 관용적 스타일과 맞지 않아 다른 개발자가 이해하기 어려워집니다.