728x90
반응형

모나드에 대해서 공부하기 전에 몇가지 개념에 대해 짚고 넘어가야 한다.
사실 잘 이해가 되지 않았고 지금도 잘 이해하고 있다고 생각하지 않는다.
하지만 정말 너무 잘 설명되어있는 글을 통해 조금 더 이해할 수 있었던 것 같다. (아래 사이트 참고!)

우선, 모나드가 갖춰야 하는 조건이 있다.

타입을 인자로 받는 타입 (특정 타입의 값을 포장)
특정 타입의 값을 포장한 것을 반환하는 함수가 존재
포장된 값을 변환하여 같은 형태로 포장하는 함수가 존재

컨텍스트 (Context)

컨텍스트는 컨텐츠를 담은 그 무언가어떤 위치에 값이 존재할 수 있는 맥락 이라고 말한다.
예를 들어 설명하자면 물이 담겨있는 물컵을 생각했을 때
물    : 컨텐츠
물컵 : 컨텍스트 
라고 생각하면 된다.

옵셔널에 대해서 공부했을 때를 떠올리면 더 쉽게 이해할 수 있다.
옵셔널은 값이 있을 수도 있고 없을 수도 있는 타입이다.

함수 객체 (Functor)

함수 객체는 고차 함수인 map 을 적용할 수 있는 컨테이너 타입 이라고 한다.
Array, Dictionary, Set 등이 컨테이너 타입, 함수 객체라고 할 수 있다.

왜 함수 객체가 map 을 적용해야 하는지 다음 예를 통해서 확인해볼 수 있다.

옵셔널 Int 타입인 number 변수가 있다.
number 에 3을 더해주려고 한다.
하지만 3은 Int 타입이기 때문에 위에서 보는 것과 같이 타입이 달라 에러가 발생한다.

여기서 number 는 컨텍스트이기 때문에 값이 있는지 없는지 모른다.
만약 값이 있다면 연산하기 위해서는 안에 있는 값을 꺼내어 연산을 해주어야 한다.
그렇기 때문에 3 을 더할 수 없다.

이때 map 을 통해서 옵셔널 타입인 number 안의 값을 꺼내 연산을 할 수 있다.

print(number.map({ $0 + 3 })) // Optional(5)

 

map 메서드를 통해 해당 요소를 하나씩 확인하면서 "값" 을 꺼내어 연산을 할 수 있다.
그런데 결과를 확인해보니 5 가 아닌 Optional(5) 인 것을 볼 수 있다.
이유는 map 메서드가 연산한 결과를 컨텍스트에 넣어주기 때문이다.

정리해보면 옵셔널은 컨텍스트 타입이고 옵셔널은 map 을 적용할 수 있기 때문에 함수 객체라고 할 수 있다.

모나드 (Monad)

그럼 모나드는 무엇일까?
모나드는 함수 객체의 일종 이다.
함수 객체는 맵 함수를 적용할 수 있는 컨테이너 타입 이고 추가로 값이 있는지 없는지 모르는 상태를 추가한다.
다시 말해, 모나드는 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 가지는 함수 객체 타입이다.

옵셔널을 통해 쉽게 이해할 수 있다.
옵셔널은 값이 있는지 없는지 알 수 없는 타입이면서 map 을 적용할 수 있는 함수 객체다.
따라서 옵셔널모나드라고 할 수 있다.

추가적으로 모나드에서는 flatMap 을 적용할 수 있다.

flatMap가 map 과 다른 점은 내부의 값을 알아서 더 추출 해준다는 것이다.
그리고 1차원 위상화? 를 해준다.
다음의 예를 통해 확인해볼 수 있다.

let mappedArray = optionalArray.map{ $0 }
let flatmappedArray = optionalArray.flatMap{ $0 }

print(mappedArray)
print(flatmappedArray)

========== 출력 결과 ==========
[Optional(1), Optional(2), nil, Optional(4)]
[1, 2, 4]

map 은 한 번만 추출해 값을 가져오지만 flapMap 은 알아서 더 추출해내는 것을 확인할 수 있다.
그리고 자세히 보면 flatMap 은 nil을 배재한 것을 확인할 수 있었다.
또 알아서 더 추출한다는 것을 알 수 있었고 nil 을 거르는 기능까지 있다는 것을 알 수 있다.

 

마지막으로 더 추가적으로 공부해서 정리해야 할 것 같다.

 

- 참고 사이트 -

zeddios.tistory.com/449

 

함수객체? 모나드? map???

안녕하세요 :) Zedd입니다. 오늘은...제목에서 볼 수 있듯이, 함수객체..모나드..등등..을 알아보려고 합니다. 저는 모나드라는 개념이 정말 딱 확실하게 와닿지가 않았는데, 읽다보니까 알 것 같아

zeddios.tistory.com

velog.io/@wimes/모나드

 

모나드

이 글은 Swift 프로그래밍책을 읽고 요약한 내용입니다.'탕'함수형 프로그래밍에서의 모나드는 순서가 있는 연산을 처리할 대 자주 활용하는 디자인패턴입니다.프로그래밍에서 모나드가 갖춰야

velog.io

m.blog.naver.com/PostView.nhn?blogId=horajjan&logNo=220964815078&proxyReferer=https:%2F%2Fwww.google.co.kr%2F

 

[Swift] 모나드(Monad) 개념 및 활용

'스위프트 프로그래밍, 16장'을 인용하였다 '함수객체(Functor)란 맵을 적용할 수 있는 컨테이너 타입'이...

blog.naver.com

oaksong.github.io/2018/01/31/flatmap/

 

Swift의 Flat Map

FlatMap = Flatten + Map Map의 모나드 버전인 FlatMap은 기본적으로 Map의 기능을 포함한다. 그러면서 두 가지 특징적이고 강력한 기능을 제공한다. 알아서 더 추출 1차원 위상화 (Flatten) 알아서 더 추출1234

oaksong.github.io

 

728x90
반응형
복사했습니다!