일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |
Tags
- Spring
- hadoop
- docker
- Linux
- Storm
- intellij
- scala
- Java
- 제주
- apache storm
- SBT
- 스프링 배치
- elasticsearch
- nginx
- Spring Boot
- Gradle
- hibernate
- Clean Code
- DDD
- design pattern
- Angular2
- elastic search
- Spring XD
- Spring Batch
- spark
- 엘라스틱서치
- hdfs
- 도메인주도설계
- Hbase
- 인텔리J
Archives
- Today
- Total
욱'S 노트
모나드/Monad (Kotlin 함수형 프로그래밍 #10) 본문
반응형
모나드를 엔도 펑터 범주에서의 모노이드라고 한다. 무슨 말인가? 앞에서 범주에 대해서 알아보았으니, 펑터에 대해서 먼저 알아보자.
펑터(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)
반응형
'Methdology > Functional Programming' 카테고리의 다른 글
모노이드/Monoid (Kotlin 함수형 프로그래밍 #9) (4) | 2025.01.23 |
---|---|
모나드 소개/Introduction of Monad (Kotlin 함수형 프로그래밍 #8) (4) | 2025.01.22 |
컴파일타임 디펜던시 인젝션/Compile Time Dependency Injection (Kotlin 함수형프로그래밍 #8) (4) | 2025.01.21 |
도메인 모델링/Domain Modeling (Kotlin 함수형 프로그래밍 #7) (2) | 2025.01.20 |
외부효과와 입출력/Effects and IO (Kotlin 함수형프로그래밍 #6) (0) | 2025.01.17 |