일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- hdfs
- DDD
- intellij
- Spring Batch
- Storm
- Java
- elastic search
- 제주
- 엘라스틱서치
- Spring XD
- nginx
- Clean Code
- hadoop
- scala
- Gradle
- 인텔리J
- Hbase
- SBT
- 스프링 배치
- Linux
- spark
- Spring Boot
- 도메인주도설계
- docker
- hibernate
- apache storm
- Spring
- elasticsearch
- design pattern
- Angular2
- Today
- Total
욱'S 노트
함수형 데이터구조/대수적 타입/Algebraic Data Type (Kotlin 함수형프로그래밍 #3) 본문
함수형 데이터구조/대수적 타입/Algebraic Data Type (Kotlin 함수형프로그래밍 #3)
devsun 2025. 1. 13. 09:46대수적 타입(ADT)
대수적 타입 즉 Algrebraic Data Type은 합타입과 곱타입으로 표현된 타입이다. 그렇다면 합타입과 곱타입이란 무엇인가?
합타입
대표적으로 enum class가 있다. 아래의 RGB 타입은 RED, GREEN, BLUE 3가지만 존재할 수 있다.
enum class RGB {
RED(),
GREEN(),
BLUE()
}
곱타입
대표적인 예로 class가 있다.
data class Person(val name: String, val age: Int, val email: String)
val lazysoul = Person("lazysoul", 33, "kotlin@gmail.com")
val goinhacker = Person("goinhacker", 36, "fp@gmail.com")
val myeongin = Person("myeongin", 33, "myeongin@gmail.comm")
Person객체는 String, Int, String 3개 타입의 프로퍼티로 구성되어있다. 즉 표현할 수 있는 값은 (String으로 표현할 수 있는 갯수) * (Int로 표현할 수 있는 갯수) * (String으로 표현할 수 있는 갯수)이다. 이런 타입을 곱타입이라고 한다.
장점
코클린에서 enum class와 sealed class가 대수적 타입이다. 합타입을 패턴매칭에서 모든 타입에 대한 구현을 컴파일러 레벨에서 강제할 수 있다. Arrow에서 제공하는 가장 기본적인 대수적 타입의 클래스는 Either이다.
sealed class Either<out E, out A>
data class Left<out E>(val value: E) : Either<E, Nothing>()
data class Right<out A>(val value: A) : Either<Nothing, A>()
만약 합타입과 곱타입으로 제한된 대수적 타입을 사용하지 않았다면, 항상 when절에서 미지의 상태를 위한 else 처리를 해야된다.
val actual = if (newDeposit.amount > 0)
Right(newDeposit.amount)
else
Left(DepositNotEnoughError)
when (actual) {
is Right -> TODO("Not implemented yet")
is Left -> TODO("Not implemented yet")
// no need else
}
불변 리스트/ 불변 트리
불변 리스트의 간단한 구현을 살펴봐도 ADT 형태로 되어 있다는 것을 알 수 있다.
아래 코드에서 List<out A>에서 A가 List의 공변적이라는 신호를 보내는 변성 어노테이션이다. 타입 X, Y에 대해 X가 Y의 하위 타입이면 List<X>도 List<Y>의 하위 타입이다. 구현에서 Nothing는 코틀린에서 모든 타입의 하위 타입이므로 Nil은 List<Int>로 간주 될 수 있고 List<Double>로 간주 될 수도 있다.
// sealed 키워드를 통해 패키지 안에서만 상속 가능하도록
sealed class List<out A>
// Empty를 표현
object Nil : List<Nothing>()
// 비어 있지 않는 리스트
data class Cons<out A>(val head: A, val tail: List<A>) : List<A>()
// 연결 함수
fun <A> append(a1: List<A>, a2: List<A>): List<A> =
when (a1) {
is Nil -> a2
is Cons -> Cons(a1.head, append(a1.tail, a2))
}
불변 트리를 생각해보더라도 핵심은 ADT이다.
sealed class Tree<out A>
data class Leaf<A>(val value: A) : Tree<A>()
data class Branch<A>(val left: Tree<A>, val right: Tree<A>) : Tree<A>()
정리
- 대수적 타입은 합타입과 곱타입으로 표현된 타입니다.
- 대수적 타입을 사용하면 패턴 매칭등을 통해 모든 경우에 대한 처리를 컴파일러 레벨에서 검사할 수 있다.
'Methdology > Functional Programming' 카테고리의 다른 글
불변 컬렉션/Immutable Collections (Kotlin 함수형 프로그래밍 #5) (4) | 2025.01.16 |
---|---|
Option을 사용해야하는 이유/Nested Nullability (Kotlin 함수형 프로그래밍 #4) (1) | 2025.01.15 |
타입 에러/Typed Errors (Kotlin 함수형 프로그래밍 #3) (0) | 2025.01.14 |
불변 데이터/Immutable Data/Optics(Kotlin 함수형 프로그래밍 #2) (0) | 2025.01.09 |
함수형 프로그래밍이란 (Kotlin 함수형 프로그래밍 #1) (0) | 2025.01.07 |