티스토리 뷰

공부

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

Zedd0202 2018. 3. 6. 23:43
반응형

안녕하세요 :) Zedd입니다.

오늘은...제목에서 볼 수 있듯이, 함수객체..모나드..등등..을 알아보려고 합니다.

저는 모나드라는 개념이 정말 딱 확실하게 와닿지가 않았는데, 

읽다보니까 알 것 같아서 정리해볼려고 해요 :)

저같은 분들에게 도움이 되는 글이었으면 좋겠습니다. 

그래서 엄청 쉽게 설명할거에용 XD



자......저는 모나드라는 개념을 알고싶은데 모나드라고 치면...

모나드 뿐만 아니라 엄청 많은 개념이 같이 나와서 조금 헷갈리더라구요.


먼저 크게 3가지 개념이 나옵니다.


컨텍스트

함수객체

모나드


이걸 설명하면서 뭐 map이니 flatMap이니...이러죠.

그럼 설명 해볼게요.


먼저 컨텍스트(context)


컨텍스트(Context)



맥락, 문맥 뭐 이런뜻이네요.

"우리"가 말하는 컨텍스트는 "어떤 위치에 값이 존재할 수 있는 맥락"이라고 생각하시면 됩니다.

값이 존재 할 "수 있는"이라니까 뭔가 값이 있을 수도 있고, 없을 수도 있다는 말 같네요.

맞습니다!!!


그럼 우리는 한가지 익숙한 것이 떠오를 수 있죠.

바로 Optional(옵셔널)입니다.

Optional은 값이 있을 수도 있고!! 없을 수도 있었죠.

여기에선는 컨텍스트를 값을 넣을 수 있는 "상자"라고 표현해요.

제가 < Optional 개념 정리 >글에서도 상자로 표현했죠!


바로 저 상자를 컨텍스트라고 생각하시면 됩니다.

아까 컨텍스트를 "어떤 위치에 값이 존재할 수 있는 맥락"이라고 했죠?

그럼 컨텍스트가 상자라고 했으니까

저 상자는 값이 존재 할 수도 있고, 존재하지 않을 수도 있구나..!!라는 것이죠.

상자 == 컨텍스트. 

이거 이해 가셨나요??


그리고 함수객체(Functor).



함수객체(Functor)


함수객체는 "고차함수인 map을 적용 할 수 있는 컨테이너 타입"이에요. 

보면 엥?????싶죠? map..?왜..?map을 적용 할 수 있다고 해서 왜 함수객체인거야?.....(저는 이랬음)


천천히 설명해볼게요.

자...위에서 컨텍스트 배웠죠? 이 컨텍스트를 가지고 연산을 해볼려고 합니다. 

근데 잘 봐요?? 우리는 컨텍스트가 값이 있는지, 없는지 모르고. 상자를 열어봐야 알죠?

Optional로 설명을 해볼게요.



var myNumber: Int? = 2

print(myNumber+3)


이런게 가능한가요? 

myNumber는 Optional. 즉 Int?타입이죠. 하지만 3은 Int타입입니다.

이 둘끼리 연산을 할 수 있을까요? 할 수 없죠. 왜냐?

Int랑 Int?는 "다른"타입이기 때문입니다.

myNumber는 상자. 즉 컨텍스트죠? 값이 있을지도, 없을지도 모르는데 거기다가 오로지 값인. 컨텍스트가 아닌. 무조건 값인!!! 3을 더할 수는 없겠죠?

그래서 이걸 꺼내는 작업이 필요하죠. 그것이 map입니다.


var myNumber: Int? = 2

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


여기서 엄청 마법같은 일이 일어나죠. 

map이라는게 요소 하나하나를 보면서, 값이 있나~~ 확인하면서 있으면!! 있으면 해당 요소를 꺼냅니다.

해당 요소를 꺼냈다는 건? 값이라는거죠? 해당 값은 어떠한 "값"일테고, 같은 타입이라면 +3이라는 연산이 가능해지겠죠.

그럼 왜!!! 왜 그냥 5가 아니라 Optional(5)가 나왔냐? map은 이 값을 컨텍스트, 즉 상자에 넣어서 돌려주기 때문이죠.


네 이때까지 함수객체를 설명했는데 조금 아시겠나요?

함수객체의 정의가 '고차함수인 map을 적용 할 수 있는 컨테이너 타입"

이라고 했는데..방금 우리가 Optional에 map을 적용했죠? 그럼 Optional == 컨테이너 타입이고, Optional이 즉 함수객체가 되는것이죠!!!!!!

이 외에도 배열(Array), 사전(Dictionary) 등도 컨테이너 타입이랍니다 :)


함수객체를 조금 아시겠나요? 그냥 정말 "고차함수인 map을 적용 할 수 있는 컨테이너 타입"입니다.


그럼 마지막으로 모나드를 설명할게요.

모나드(Monad)


저는 처음에 모나드가 머여...하고 모나드의 정의를 봤었는데


??더모르겠음

무엇으로도 나눌 수 없는 궁극적인 실체라니..말은 너무 간지나지만 이해가 잘 안되네요.

그래서 모나드는 일단 마지막에 나왔으니 최종보스같은 아이입니다.

위에서 배운 컨텍스트와 함수객체를 알아야만 모나드를 이해 할 수 있죠.


먼저!!!!!!!!!!!!!!!!!!!!!!!!모나드는 함수객체의 일종이에요.

어 이말은 모나드는 함수객체의 일종이다 == 모나드에는 map을 적용 할 수 있다.

가 되겠네요. 이까지는 이해하시겠죠?!!?

여기에 컨텍스트 개념을 더합니다.


즉, 모나드는 값이 있을 수도 있고 없을 수도 있는 컨텍스트를 가지는 함수객체 타입 

== 

모나드는 값이 있을수도 있고, 없을 수도 있는 컨텍스트(맥락)을 가지는 map을 적용 할 수 있는 타입이라는 것이죠.

근데, 이 두가지 조건에 부합하는, 지금 우리가 생각하는 그게 떠오릅니다.

바로, 위에서 말했던 Optional이죠. Optional은 정의 자체가 값이 있을수도, 없을 수도 있는 타입이며, map까지 적용 할 수 있는 함수객체였죠.


그럼 Optional == 모나드냐???

맞습니다.


여러분 그렇게 어렵게 느껴졌던 모나드가.. Optional로 생각하시면 편합니다.

뭐 Optional만 있는건...아닐지도 모르지만 적어도 지금 우리가 생각 할 수 있는건 Optional이네요. 

Optional이 모나드인건 알겠고.. 위에서 함수객체중 하나가 Optional이었죠?

즉, Optional은 함수객체이면서 모나드네요 :)


함수객체에서는 컨테이너 타입들에 map을 적용 할 수 있었죠? 그게 정의였구요.

모나드에서는 flatMap을 적용 할 수 있습니다.

Optional은 함수객체이자 모나드였으므로 map과 flatMap을 둘 다 적용 할 수 있죠.





참고 : 

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

http://www.mokacoding.com/blog/functor-applicative-monads-in-pictures/


반응형

'공부' 카테고리의 다른 글

알고리즘 ) Binary Search Tree - 삭제  (7) 2018.04.01
[Clean Code] 5 : 형식 맞추기  (0) 2018.03.16
File System Programming Guide  (0) 2018.02.28
Apple의 파일시스템. HFS+와 APFS  (0) 2018.02.23
[Clean Code] 4 : 주석  (0) 2018.02.17