일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Spring
- hadoop
- Angular2
- hibernate
- hdfs
- Storm
- Spring XD
- Java
- apache storm
- Hbase
- 제주
- 도메인주도설계
- DDD
- elastic search
- Spring Boot
- 스프링 배치
- SBT
- nginx
- 인텔리J
- Linux
- Spring Batch
- Gradle
- 엘라스틱서치
- scala
- docker
- elasticsearch
- intellij
- spark
- design pattern
- Clean Code
- Today
- Total
욱'S 노트
Arrow KT 시작하기 - Getting Started 본문
개요
애로우의 목적은 관용적인(idiomatic) 함수형 프로그래밍을 코틀린에 적용하는 것을 목표로 한다. 애로우는 다른 함수형 프로그래밍 커뮤니티에서 만들어진 라이브러리들의 영향을 받았다.
설정
설정은 gralde기반으로 일단 정리해보았다.
디펜던시 추가
dependencies {
implementation("io.arrow-kt:arrow-core:1.2.1")
implementation("io.arrow-kt:arrow-fx-coroutines:1.2.1")
}
플러그인 설정
옵틱을 위한 플러그인 설정이다. 이 플러그인은 KSP(Kotlin Symbol Processing는 경량 컴파일러 플러그인.) 기반으로 만들어 졌다.
plugins {
id("com.google.devtools.ksp") version "1.8.21-1.0.11"
}
dependencies {
implementation("io.arrow-kt:arrow-optics:1.2.1")
ksp("io.arrow-kt:arrow-optics-ksp-plugin:1.2.1")
}
Serialization
애로우는 Either나 NonEmptyList와 같은 다양한 타입을 지원한다. 이에 Serialization에 대한 기능도 제공한다.
아래는 Jackson은 모듈에 대한 Serialization 설정이다.
val mapper = ObjectMapper()
.registerKotlinModule()
.registerArrowModule()
kotlinx.serialization를 사용한다면 다음과 같이 처리할 수 있다.
val format = Json { serializersModule = ArrowModule }
val payload = format.encodeToString(nonEmptyListOf("hello", "world"))
다른 함수형 언어와 비교
애로우는 다른 함수형 프로그래밍에 영향을 많이 받았다. 다른 에코시스템과 간단히 비교해보자.
Computation blocks
스칼라나 하스켈에서는 flatMap 연산을 정의한 타입을 지원하기 위해 특별한 지원이 존재한다. 스칼라에서는 for 컴프리헨션, 하스켈에서는 do 노테이션이라고 부른다. Either는 그러한 타입중에 하나라서 for 또는 do를 활용할 수 있다.
def mkPerson(name: String, age: Int): Either[Problem, Person] = for {
name_ <- validName(name)
age_ <- validAge(age)
} yield Person(name_, age_)
mkPerson :: String -> Int -> Either Problem Person
mkPerson name age = do
name_ <- validName name
age_ <- validAge age
pure (Person name_ age_)
코틀린에서는 그러한 generic constructor를 제공하지 않는다. 하지만 애로우에서 에러 타입들을 위한 비슷한 문법을 지원한다.
- for 대신에 either, result, nullabe을 사용해서 명시적으로 에러타입 처리를 요청할 수 있다. 이러한 함수는 arrow.core.raise 패키지에 존재한다.
- 모든 ← 의 사용은 .bind()의 호출로 대체된다.
fun mkPerson(name: String, age: Int): Either<Problem, Person> = either {
val name_ = validName(name).bind()
val age_ = validAge(age).bind()
Person(name_, age_)
}
suspend instead of IO
스칼라나 하스켈에는 사이드이펙트를 나타내기 위해 특별한 IO Wrapper를 제공한다. 스칼라에서는 유명한 라이브러리 Cats Effect로 소개한다. 애로우에서는 사이드 이펙트 처리를 위해 코루틴을 기반으로 한 suspend 함수를 이용해 표시한다.
참조 : https://arrow-kt.io/