티스토리 뷰

0. Monad

0.1 Functor

interface Functor<T> {
    <R> Functor<R> map(Function<T, R> f);
}

:: 함수형 프로그래밍의 중요 개념

:: 값이나 객체를 감싸고 있는 구조체

:: 값을 변형하거나 변환할 수 있는 기능을 제공

:: 데이터를 변경하지 않고 새로운 값으로 변형하는 방식 -> 불변성 유지

:: 종류로 java에서는 List, Optional가 있음

 => "값을 감싸는 컨테이너"

=> 값의 데이터 구조 -> 새 값의 데이터 구조

 

더보기
public class FunctorExample {
    public static void main(String[] args) {
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 리스트 생성

        // map을 사용하여 모든 값을 2배로 변환
        List<Integer> doubledNumbers = numbers.stream()
                                               .map(x -> x * 2)
                                               .collect(Collectors.toList());

        System.out.println(doubledNumbers);  // 출력: [2, 4, 6, 8, 10]
    }
}

map 연산자를 사용해 내부 값 변형 후,

새로운 List로 반환


0.1-1 Functor 법칙

1. Identity Law

:: map(id)의 경우, 값을 그대로 반환

List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> result = numbers.stream()
                              .map(x -> x)  // 변형하지 않음
                              .collect(Collectors.toList());
System.out.println(result);  // 출력: [1, 2, 3]

 

2. Composition Law

:: map(f . g)의 결과 == map(f) 후의 map(g)의 결과

List<Integer> numbers = Arrays.asList(1, 2, 3);
List<Integer> result = numbers.stream()
                              .map(x -> x * 2)  // 먼저 2배로 변환
                              .map(x -> x + 1)  // 그 다음 1을 더함
                              //.map(x-> x*2 +1) 와 같아야 함
                              .collect(Collectors.toList());
System.out.println(result);  // 출력: [3, 5, 7]

0.2 Monad

interface Monad<T,R extends Monad<?,?>> extends Functor<T,R> {
	R flatMap(Function<T,R> f);
}

:: Functor의 확장된 개념 -> "값을 결합"하고 "순차적으로 처리"할 수 있는 추가적인 기능을 제공

:: 데이터를 다루는 방식과 연산을 체이닝 할 수 있는 구조

:: NPE 방지 및 지연 연산(Lazy Evaluation)

=> 값+상태의 데이터 구조 -> 새 값+상태의 데이터 구조

Monad 기본 구성 요소 역할
unit || return 데이터를 Monad로 감쌈
bind || flatMap Monad 안의 값을 변환
(값을 추출하여 연산 후, 새 Monad 반환)

- flatMap을 통해 평탄화 작업을 시행

- Functor의 중첩의 경우 map 사용 시, Monad의 value가 아닌 Monad에 연산하기 때문

 


참조

ASAC 수업자료

잘정리된 블로

 

Monad는 대체 무엇인가?

범주론에서 모나드(영어: monad)는 내부 함자 범주의 모노이드 대상이다.... 무슨 소리지?

velog.io

 

'정리용 > java' 카테고리의 다른 글

[JAVA] 기초 8. Monad - Optional  (0) 2025.02.04
[JAVA] 기초 8. 함수형 인터페이스 - 끝..  (0) 2025.02.04
[JAVA] 기초 7. 키워드 Enum  (1) 2025.02.04
[JAVA] 기초 4-1 다형성과 상속  (0) 2025.02.04
[JAVA] 기초 6. Generic  (0) 2025.01.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함