욱'S 노트

모나드/Monad (Kotlin 함수형 프로그래밍 #10) 본문

Methdology/Functional Programming

모나드/Monad (Kotlin 함수형 프로그래밍 #10)

devsun 2025. 2. 7. 10:00
반응형

모나드를 엔도 펑터 범주에서의 모노이드라고 한다. 무슨 말인가? 앞에서 범주에 대해서 알아보았으니, 펑터에 대해서 먼저 알아보자.

 

펑터(Functor)

아래 두가지 범주(카테고리)를 가정해보자


범주D - 대상(A, B, C), 사상(f:A → B, g:B → C, h:A → C)

범주E - 대상(X, Y, Z), 사상(F(f):X → Y, F(g):Y → Z,F(h):X → Z)

대상 대응: 펑터F는 범주 D의 대상 A, B, C를 범주 E의 대상 X, Y, Z로 대응시킵니다. F(A) = X, F(B) = Y, F(C) = Z
사상 대응: 펑터F는 범주 D의 사상 f, g, h를 범주 E의 사상 F(f), F(g), F(h)로 대응 시킵니다. F(f) = X → Y, F(g) = Y → Z, F(h) = X → Z
항등 사상 보존: 펑터 F는 범주 D의 모든 대상 A, B, C에 대한 항등 사상을 보존합니다. F(id_A) = id_X
합성 사상 보존: 펑터 F는 범주 D의 모든 사상 f, g, h에 대해 합성 사상을 보존합니다. 범주 D는 h = g•f는 범주 E에서 F(h) = F(g)•F(h)

 

결국 map이다.

interface Functor<F> {
    fun <A, B> map(fa: Kind<F, A>, f: (A) -> B): Kind<F, B>
}
sealed class Option<out A> {
    companion object {
        fun <A> empty(): Option<A> = None
    }

    fun <B> map(f: (A) -> B): Option<B> =
        when (this) {
            is None -> None
            is Some -> Some(f(this.get))
        }
}

 

엔도 펑터(endo functor)

endo란 단어는 내부의 나, 내부로라는 뜻. 엔도펑터랑 범주내에서 작동하는 펑터를 의미한다.

typealias Endo<A> = (A) -> A

fun <A> fmap(o: Option<A>, f: Endo<A>): Option<A> = o.map(f)

 

모나드(Monad)

모나드는 엔도펑터 범주에서의 모노이드다.

모노이드는 집합(Set)과 이항 연산(Binary operation)을 가지며, 결합법칙(Assosiation)과 항등원(identity)을 만족하는 대수 구조이다.

엔도펑터는 범주 C의 대상과 사상을 동일한 범주 C에 대응 시키는 자기 자신으로의 펑터이다.

대상 - 엔도 펑터, 범주 C의 대상과 사상을 동일한 범주 C내에서 대응시키는 펑터
사상 - 이항 연산, 엔도펑터의 합성. 두 엔도펑터를 입력 받아서 새로운 엔도펑터를 반환하는 연산, 이 연산은 범주 C 내에서만

요구사항 
결합법칙 - 모든 엔도펑터 F, G, H에 대해 (F•G)•H = F•(G•H)가 성립해야 한다. 즉, 엔도펑터의 합성 순서가 결과에 영향을 주지 않는다.
항등원 - 범주 C의 모든 엔도펑터 F와 합성을 수행할 때 결과가 자기 자신이 되는 엔도펑터를 의미한다. 즉 I•F = F•I = F가 성립해야 한다.

 

모나드의 결국 아래의 구성 요소를 가진다. 결국 flatMap과 lift이다.

바인드 함수(Bind Function)  - 모나드를 받아들이고, 모나드에 포함된 값을 다루는 함수를 받아 들여서, 새로운 모나드를 반환합니다. (flatMap)
리턴 함수(Return Function) - 일반 값을 모나드로 변환시킨다. (lift)
반응형