일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Storm
- docker
- 제주
- Linux
- SBT
- nginx
- spark
- Gradle
- hibernate
- Spring
- Hbase
- Angular2
- apache storm
- Spring XD
- 인텔리J
- Clean Code
- intellij
- hadoop
- elasticsearch
- 엘라스틱서치
- Spring Batch
- Java
- DDD
- scala
- elastic search
- Spring Boot
- hdfs
- 도메인주도설계
- 스프링 배치
- design pattern
- Today
- Total
목록Methdology (66)
욱'S 노트
모나드를 엔도 펑터 범주에서의 모노이드라고 한다. 무슨 말인가? 앞에서 범주에 대해서 알아보았으니, 펑터에 대해서 먼저 알아보자. 펑터(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 →..
![](http://i1.daumcdn.net/thumb/C150x150.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/Fg5n6/btsLV3YgDkI/IIKtqylMQc5HQaQ9lBLap1/img.png)
범주(Category)범주란 대상(Object)과 사상(Morphism)의 모음항등사상: 대상 A에 대한 항등 사상(id_A)가 존재해야 한다. 이 사상은 A에서 A로 가는 사상사상의 연속성: f: A→B와 g: B->C가 주어졌을때, 두 사상의 합성 g∙f: A→C가 존재해야 한다. 두 사상을 연결하여 하나의 사상으로 만들 수 있어야 한다.합성의 결합법칙: 세 개의 사상 f,g,h가 주어졌을때, (h∙g)∙f = h∙(g∙f)가 성립해야 한다. 사상을 연결할 때 순서가 중요하지 않다. 대상은 수학적으로는 집합이며 프로그래밍에서 익숙한 용어로 바꾸면 타입이다. 예를 들어 정수 타입은 모든 정수를, 부울 타입은 참과 거짓 만을 포함한다. 사상은 화살표(arrow)이다. 화살표는 두 대상 사이의 관계를 나타..
일단 모나드에 대한 용어에 신경쓰지 말고 시작해보자.모나드가 없을 때간단한 Either를 하나 작성해보자.sealed interface Either { data class Left(val error: A) : Either data class Right(val value: B) : Either} 계좌의 입출금 문제를 생각해보자sealed interface Error { data object NegativeAmount : Error}data class Account private constructor(val balance: BigDecimal) { companion object { fun create(initial: BigDecimal): Either { ..
자바나 스프링을 미리 경험했다면 의존성 주입(Dependency Injection)이라는 것에 익숙할 것이다. 그러나 기존의 방식은 런타임시에 의존성 주입이 발생한다. 앞에서 살펴봤듯이 함수형 프로그래밍에서는 최대한 컴파일러가 타입 안전을 검사하기를 원한다. 코틀린에서는 이 문제를 어떻게 해결할 수 있을지 살펴보자.Effects앞에서 효과가 무엇인지 알아봤다. 효과를 명시적으로 함수의 시그니처에 포함시키자는 것이 주요 아이디어이다. 기본적으로 순수 함수라면 함수는 연산만을 수행한다라고 얘기한다.fun add(x: Int, y: Int): Int = x + y 위의 간단한 순수 함수에 사이드 이펙트를 포함시켜 보자.fun loggingAdd(x: Int, y: Int): Int { println("x ..
함수형 도메인 모델링의 목적은 비즈니스 도메인을 정확하게 묘사하는 것이다. 컴파일러를 최대한 활용하여 타입-세이프하고, 버그를 방지하고 유닛테스트를 경감 시키는 것이 목적이다. 앞에서 살펴봤듯이 함수형 프로그래밍은 타입 주도 개발(Type Driven Development)을 따르기도 한다. 타입은 함수와 데이터가 준수해야 하는 엄격한 계약이다. 타입 시스템을 이를 어길 수 없다. 그러므로 다양한 케이스에 대한 유닛테스트도 경감시킬 수 있는 것이다.코틀린은 함수형 도메인 모델링에 적합하다. 코틀린은 data class, sealed class, enum class, value class를 제공한다. 그리고 애로우를 이용한다면, Either와 같은 흥미로운 데이터 타입을 제공 받을 수 있다.예제기본 타입 ..
처음에 얘기했다시피 함수형 프로그래밍은 제약이 없다. FP에서 외부효과와 입출력을 다루는 방식이 대해서 알아보자. 핵심은 부수효과를 분리해 내는 것이다.엄격성과 지연성함수는 엄격(strict)할 수 있고, 지연(Lazy)될 수 도 있다. 지연성(Lazyness)를 활용하면 프로그램의 기술과 평가를 분리할 수 있다. Strict function항상 모든 즉시(eager) 탐욕적(greedy)으로 인자를 평가(eager, greddy)대부분의 프로그래밍 언어의 표준Lazy function내장 구문(&&, ||, if)에서 지원평가하지 않는 타입은 () → A와 같이 정의. 이와 같은 함수를 썽크(thunk)라고 부름fun lazyIf( cond: Boolean, onTrue: () -> A, /..
불변 컬렉션앞에서 보았듯이 함수형 프로그래밍에서는 항상 불변값과 대수적 타입으로 값을 다룬다. 이는 컬렉션의 경우에도 마찬가지이다. 리스트의 가장 기본적인 구현을 보면 아래와 같다.// sealed 키워드를 통해 패키지 안에서만 상속 가능하도록sealed class List// Empty를 표현object Nil : List()// 비어 있지 않는 리스트data class Cons(val head: A, val tail: List) : List() 데이터 공유불변 리스트 xs에 1이라는 원소를 추가한다면 Cons(1, xs) 새로운 리스트를 반환하면 된다. 삭제를 한다면 tail을 반환하면 됨. 이를 데이터 공유라고 한다. 데이터 변경이나 오염을 피하기 위해서 복사본을 만들 필요가 없다. 데이터 구조가 ..
예전에 자바를 사용했었다면, NullpointerException을 겪었을 것이다. 널의 가장 큰 문제점은 클라이언트 코드에서 예상할 수 어렵다는데 있었다. 코틀린에서는 ?을 베이스로 null-safety 문제를 해결하고 있다. 코틀린에는 nullable type이 있지만, Arrow에 Option 타입이 있는 이유에 대해서 알아보자.fun List.firstOrElse(default: () -> A): A = firstOrNull() ?: default()fun example() { emptyList().firstOrElse { -1 } shouldBe -1 listOf(1, null, 3).firstOrElse { -1 } shouldBe 1} 다음 코드를 예상해보자.fun example()..
예외(Exception)의 문제점예외를 던지는 것은 부수효과이다. 그로 인한 문제점은 제어 상실이다. 제어 상실은 예외가 처리되지 않아 프로그램이 중단되거나, 호출 스택위의 어떤 코드가 예외를 잡아서 예외를 처리하는 상황을 의미한다.아래의 코드를 보면 치환 모델이 제공하는 단순한 추론을 벗어나서 참조투명성이 깨지는 것을 확인할 수 있다. 예외를 사용하면 프로그램 전체에서 전역적 추론을 해야되는 문제가 발생한다.fun failingFn(i: Int): Int { val y: Int = throw Exception("boom") // return try { val x = 42 + 5 x + y } catch (e: Exception) { 43 // ..
대수적 타입(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..