Monad๋ ์ด๋ป๊ฒ ์ ์ํ ์ ์์๊น?
Monad
Monad: ๋ค์์ ์ฐ์ฐ๋ค์ด ์ ์๋ Functor
unit:
T -> M<T>
(return
in Haskell)flat:
M<M<T>> -> M<T>
(join
in Haskell)
- Functor์
unit
ํ๊ณflat
์ถ๊ฐํ๊ฒ ๋ชจ๋๋๋ค. - ์ง๊ด์ ์ผ๋ก๋ง ์ดํดํ๊ณ ,
unit
,flat
์ด ์ด๋ค ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋์ง๋ ๊ฐ์ฅ ์๋์์ ์์๋ณด์.
Monad ํจ์์ ์ถ๊ฐ ์กฐ๊ฑด
unit
,flat
ํจ์๊ฐ ๊ฐ์ ธ์ผํ ์ถ๊ฐ ์กฐ๊ฑด์ ๋ํด ์ค๋ช ํ๋ค.
Naturality for unit.
T->U
๋ก ๊ฐ๋ ํจ์๋ฅผf
๋ผ๊ณ ์ ์ํด๋ณด์.lift
ํจ์์f
๋ฅผ ์ธ์๋ก ๋ฃ์ด์ ๋์ค๋ ๋ฐํ ๊ฐ์ ํ์ ์M<T> -> M<U>
์ด๋ค.- ๊ทธ๋ ๋ค๋ฉด ์ด ๋ฐํ ํจ์์
M<T>
๋ฅผ ์ธ์๋ก ๋ฃ์ด์ ๋์ค๋ ๋ฐํ ๊ฐ์ ํ์ ์M<U>
์ด๋ค.
- ์์ฐ์ฑ์ ๋ง์กฑํ๋ค๋ ๋ง์, (Natural Transformation)
f
๋ฅผ ์ ์ฉํ ํunit
ํจ์๋ฅผ ์ ์ฉํ ๊ฒ๊ณผunit
ํจ์๋ฅผ ํตํดM<T>
๋ฅผM<U>
๋ก ๋ฐ๊พธ๊ณ ,f
๋ฅผ ์ ์ฉํ ๊ฒ์ด ๊ฐ๋ค๋ ๋ง์ด๋ค.
Naturality for flat
naturality for flat.
- ๋ง์ฐฌ๊ฐ์ง๋ก
T->U
๋ก ๊ฐ๋ ํจ์๋ฅผf
๋ผ๊ณ ์ ์ํด๋ณด์. lift
ํจ์์f
๋ฅผ ์ธ์๋ก ๋ฃ์ด์ ๋์ค๋ ๋ฐํ ๊ฐ์ ํ์ ์M<T> -> M<U>
์ด๋ค.- ๋น์ฐํ
M<T>
๋ฅผ ์ ํจ์์ ๋ฃ์ผ๋ฉด ๋ฐํ๊ฐ์M<U>
์ด๋ค. M<M<T>>
๋ฅผM<M<U>>
๋ก ๋ฐ๊พธ๋ ค๋ฉดlift(lift(f))
๋ฅผ ์ ์ฉํด์ผ ํ๋ค.
- ์์ฐ์ฑ์ ๋ง์กฑํ๋ค๋ ๋ง์,
lift(lift(f))
๋ฅผ ์ ์ฉํ ํflat
ํจ์๋ฅผ ์ ์ฉํ ๊ฒ๊ณผflat
ํจ์๋ฅผ ์ ์ฉํ๊ณlift(f)
๋ฅผ ์ ์ฉํ ๊ฒ์ด ๊ฐ๋ค๋ ๋ง์ด๋ค.
Identity
M<T>
๋ฅผM<M<T>>
๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ๊ฐ ์๋ค.unit
์ ์ ์ฉํ๊ฑฐ๋,lift(unit)
์ ์ ์ฉํ๊ฑฐ๋.- ์ง๊ธ ์๊ฐํด๋ณด๋
unit
์ด๋ผ๋ ํจ์์ ์ด๋ฆ์ด ์ด ๋๋ฌธ์ธ ๋ฏ ํ๋ค. lift
๋ฅผ ์ฌ๋ฌ๋ฒ ์ ์ฉํ์ ๋์ ํจ์์unit
์ ์ ์ฉํ์ ๋์ ํจ์๊ฐ ๊ฐ๋ค.- ํ์ ์ด ํ๊บผํ ์ธ์ ธ์๋ ๊ฒ์ผ๋ก ๋ณด์ด์ง๋ง, Generic์ด๊ธฐ ๋๋ฌธ์ ์ด๋ค ํ์ ๋ ๋ค์ด๊ฐ ์ ์๊ธฐ ๋๋ฌธ์ ๊ตฌ์กฐ์ ์ผ๋ก ๊ฐ๋ค.
- ์ง๊ธ ์๊ฐํด๋ณด๋
unit
์ ์ ์ฉํ๋ค๋ ๊ฒ์M<T>
ํ์ ์์ฒด์ ํจ์ ๋์์ ๊ฑธ์ด๋ฒ๋ฆฌ๋ ๊ฒ์ด๊ณ ,lift(unit)
์ ์ ์ฉํ๋ค๋ ๊ฒ์T
ํ์ ์unit
ํจ์๋ฅผ ์ ์ฉํ๋ค๋ ๊ฐ์ ์ ํ ์ํฉ์์lift
๋ฅผ ํตํด ํ์ฐจ์ ๋์ธ ์ํ์ ํจ์๋ฅผ ๋ง๋ค๊ณ ์ ์ฉํ๋ค๊ณ ์๊ฐํ ์ ์๊ฒ ๋ค.
- ์ด๋ ๊ฒ ๋์จ
M<M<T>>
์flat
ํจ์๋ฅผ ๊ฑธ์์ ๋ ๊ฒฐ๊ณผ๋M<T>
๋ก ๋์์ผ ํ๋ค๋ ๊ฒ์ด ํญ๋ฑ์ฑ(Identity)์ด๋ค. - ์ฆ, ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์ ๋์์ ๊ฒฐ๊ณผ๋ ํญ๋ฑํจ์๋ก ๋์์ผ ํ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ ๊ฐ์์ผ ํ๋ค.
Associativity
M<M<M<T>>>
๋ฅผM<M<T>>
๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ๊ฐ ์๋ค.flat
์ ์ ์ฉํ๊ฑฐ๋,lift(flat)
์ ์ ์ฉํ๊ฑฐ๋.- ์ด ์์๋ฅผ ๋ฐ๊ฟ์ ์ฐ์ฐํ๋ฉด ๊ฒฐ๊ณผ๊ฐ์ ๋ค๋ฅผ ์ ์๋ค.
- ํ์ง๋ง ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ํ๋ฒ flat์ผ๋ก ๋ด๋ ธ์ ๋ ๋์ค๋ ๊ฒฐ๊ณผ๋ ๋ฐ๋์ ๊ฐ์์ผ ํ๋ค.
์ ๋ด์ฉ์ด ์๋ฏธํ๋ ๋ฐ
Semantics in Naturality
T->U
๋ก ๋ณด๋ด๋ ํจ์๋ค์ ์งํฉ์ ํ๋ ์๊ฐํด๋ณด์.T
,U
๋ ์ ๋ค๋ฆญ์ผ๋ก ํํ๋์์ผ๋, ํ๋ํ๋ ๊ตฌ์ฒด ํ์ ์ ๋ฃ์ด๋ณด๋ฉด ์์๋ค์ด ์๋ ๊ณต๊ฐ์ด ๋ ์ค๋ฅผ ๊ฒ์ด๋ค.- ๋ง์ฐฌ๊ฐ์ง๋ก
M<T>->M<U>
๋ก ๋ณด๋ด๋ ํจ์๋ค์ ์งํฉ๋ ์๊ฐํด๋ณด์. - ์๋ง ์๋์์ด ๋ง์ ๊ฒ์ด๋ค.
- ๊ทธ๋ฆฌ๊ณ ์ด ์ฌ์๊ด๊ณ์ ๋ก์ง๋ ์๋์์ด ๋ง์ ๊ฒ์ด๋ค.
Double->String
์ผ๋ก ๊ฐ๋ ํจ์ ์์์ ๊ฐ์๋ ์์ฒญ๋ง์๋ฐ, ์ฌ์ค ๊ทธ ๋ณํ ํจ์ ๋ก์ง์ ๋ค์์ฑ๊น์ง ํฌํจํด์ผํ๋ค.- ๊ทธ๋ ๋ค๋ฉด ์ด ์งํฉ์ ๋ฌดํ์งํฉ์ผ ๊ฒ์ด๋ค.
- ์ด ๋ชจ๋ ์์๋ฅผ ์๋ฅผ ๋ค๋ฉด์ ์ค๋ช ํ ์ ์์ผ๋,
T->U
๋ก ๊ฐ๋ ํจ์ ์์๋ฅผ ๋ํํ ์ ์๊ฒ ์์ ๊ฐ์ด ๊ทธ๋ฆผ์ ๊ทธ๋ ค๋ณด์๋ค.- ํจ์์ ํํ์ ๋ฐ๋ผ ์์ ๊ฐ์๊ฐ ๋์ด๋๋ค ํ์ผ๋ ์ด ์ญ์๋
f
์ ๊ฐ์ ํํ๋ก ๋ณ์๋ก ํํํ๋ค. - ์ด๋ ๊ฒ ์ผ์ชฝ ์งํฉ์ด ์ ์ ๋๋ค๋ฉด, Monad๋ ์ผ๋จ Functor๋๊น ์ค๋ฅธ์ชฝ ์งํฉ๋ ๋น์ฐํ ์ ์๋ ์ ์๋ค.
- ์ด ๋ ๋ณํ์ ๋์๋๋ ๊ฒ์
lift(f)
์ด๋ค.
- ๊ฐ ํ์ ์ ๋ ๊ทธ ์์ ๋ค์ด๊ฐ ์ ์๋ ๊ฐ๋ค์ ๋ํํ๋ ์งํฉ์ผ๋ก ์๊ฐํ ์ ์๋ค.
- ๊ฐ๋ น
Double
์๋ฃํ์ 1.0, -3000๊ณผ ๊ฐ์ ๋ค์ํ ์ค์๊ฐ์ ๋ฐ์ํ ์ ์๋ ์งํฉ์ ๊ฐ๋ ์ด๋ค. - ์ด๋ ๊ฒ ํ์ ์ ํด๋นํ๋ ๊ฐ์ โ์ โ์ ํํ๋ก ๊ทธ๋ฆผ์ ํํํ๋ค.
- ๊ทธ๋ฆฌ๊ณ
f
๋ผ๋ ๋ณํ์ ๊ฐ๋ค์ดU
์ ๊ณต๊ฐ์ ํน์ ์ ์ ๋งคํ๋๋ค๊ณ ํ ์ ์๋ค. - ๊ทธ๋ผ
M<T>->M<U>
์ ๋์๋๋ ์์๋ ์ด๋ป๊ฒ ๊ทธ๋ฆด ์ ์์๊น? - ์ผ๋จ ์์๊ฐ ์์ ๊ฑฐ๋ผ๋ ๊ฑด ์ฝ๊ฒ ์์ํ ์ ์๋ค.
- ๊ทธ๋ผ ๋ชจ๋๋ ์ธ ๊ฒฝ์ฐ ์ด ๋งคํ๊ด๊ณ (
f
์ ๋์๋๋ ๋ ์)์ ๋ฌด์์ด ๋ ์ ์์๊น?
unit
- ๊ทธ ์ ์ ๋จผ์ Monad๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด์ธ
unit
ํจ์์ ์๋ฏธ๋ถํฐ ์์๋ณด์. unit
ํจ์๋ ํจ์๋ฅผ ์์๋ก ๊ฐ๋ ๋ ์งํฉ ์ฌ์ด์ ๊ด๊ณ๋ฅผ ์ ์ํ๋ค.- ์ด ๊ด๊ณ๋ ํจ์๋ฅผ ์์๋ก ๊ฐ๋ ์งํฉ์ ์ธ์์ ํด๋นํ๋ ํ์ ์ ๋ชจ๋๋ ํ์ ์ ์์๋ก ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ํ๋ค.
lift
- ๊ทธ๋ ๋ค๋ฉด
lift
์ ์ด๋ป๊ฒ ๋์ํ ์ ์์๊น. T
์U
์ฌ์ด์f
๋ผ๋ ๋ ผ๋ฆฌ์ ๊ด๊ณ๊ฐ ์ ์๋์ด ์๋ค๋ฉด,T
์U
๋ฅผunit
ํ ๊ฐ๋ค ์ฌ์ด์์๋lift(f)
๋ก ํํ๋๋ ๋ ผ๋ฆฌ์ ๊ด๊ณ๊ฐ ์กด์ฌํด์ผ ํ๋ค.- ๋ชจ๋๋๊ฐ ๋๊ธฐ ์ํด์๋ ๊ทธ๋์ผ ํ๋ค.
- ์ด๋ฌํ ๊ด๊ณ๊ฐ ๋ง์ด ๋๊ธฐ ์ํด์๋
unit
์ด๋ผ๋ ๊ด๊ณ๋ ๊ฐ๋ค ์ฌ์ด์ ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ์ ๋ถ ๋ณด์กดํ๋ ๋ณํ์ด์ด์ผ ํ๋ค. - ์ฆ,
T
ํ์ ์ ๋ชจ๋๋ํ ํ๋unit
์ฐ์ฐ์ ์ํ ๊ฒฐ๊ณผ๋,T
์ ์๋ฏธ๋ฅผ ์ ๋ถ ๋ณด์กดํด์ผ๋ง ํ๋ค. - ๊ทธ๋ด๋ ค๋ฉด ๊ฐ์ ์๋ฏธ๋ฅผ ์ ์งํ ์ฑ ํ์ ๋ง ๋ฐ๊พธ๋ ๋ณํ์ด ์๋๋ฉด ๋ถ๊ฐ๋ฅํ๋ค.
- ์์ปจ๋ฐ
Int
์Double
๋ก ๋ฐ๊พธ๋ ์ฐ์ฐ. - ์ฆ,
M<T>
๋T
๋๋T
์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๋๋ฑํ ๊ฐ๋ ์ ์ง์นญํ๋ ํ์ ์ด๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
flat
flat
์M<M<T>>
๋ฅผM<T>
๋ก ๋ฐ๊ฟ์ฃผ๋ ์ฐ์ฐ์ด๋ค.- ์ด ๋, ๋ชจ๋ ๋
ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ๋ณด์กดํ ํ์๋ ์๋ค.
- ์ฐจ์์ ๋ฎ์ถ๋ ํ์์ด๊ธฐ ๋๋ฌธ์ ์ ์ด์ ์ด์์ ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ๋ค.
- ํ์ง๋ง
lift(lift(f))
๋ก ํํ๋์๋ ์ฐ์ฐ์ โ์ผ๋ถโ ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ ๋ณด์กดํด์ผ ํ๋ค.- ๋ชจ๋๋์ ์ ์์์ ์ํ๋๊ฒ ๊ทธ๊ฑฐ๋ค.
- ๊ทธ๋ฌ๋ฌ๋ฉด
flat
์ด๋ผ๋ ํจ์๋ ๊ฐ์ ์๋ฏธ๋ฅผ ์ ์ด๋ ์ผ๋ถ๋ ๋ณด์กดํ ์ฑM<M<T>>
๋ฅผM<T>
๋ก ๋ฐ๊พธ๋ ๋ณํ์ด ๋์ด์ผ ํ๋ค.
์๋ฏธ๋ก ์ ๊ณ ์ฐฐ์ ๊ฒฐ๋ก
- ์์์ ํ ์์ ์ ๋ชจ๋๋์ ์ ์๋ฅผ ํ ๋๋ก ๋์ํํ ๋ค, ๊ทธ ์๋ฏธ๋ฅผ ์ฐพ์๋ณด๋ ๊ณผ์ ์ด์๋ค.
- ์ด ๊ฒฐ๊ณผ ์ป์ด์ง๋ ์๋ฏธ๋ก ์ ๊ฒฐ๋ก ์ ๋ค์๊ณผ ๊ฐ๋ค.
M<T>
๋T
์ ์๋ฏธ๋ฅผ ํ์ฅํ ์๋ฏธ๋ฅผ ๊ฐ์ง ํ์ ์ด์ด์ผ ํ๋ค. (unit
)M<M<T>>
๋ ์ด๋ค ์๋ฏธ์์๋M<T>
์ ๊ฐ์ด ๊ฐ์ฃผ๋ ์ ์์ด์ผ ํ๋ค. (flat
)
์์
Optional
T
์ ์๋ฏธ๋ฅผ ํ์ฅํOptional
์ ์๋ฏธ๋T
๋๋nil
์ด๋ค. ์ฆ, ํฌํจํ ์ฑ๋ก ํ์ฅํ ์๋ฏธ์ด๋ค.Optional<Optional<T>>
๋Optional<T>
์ ๊ฐ์ด ๊ฐ์ฃผ๋ ์ ์๋ค.
Array
T
์ ์๋ฏธ๋ฅผ ํ์ฅํArray
์ ์๋ฏธ๋T
์ ์งํฉ์ด๋ค. ์ฆ, ํฌํจํ ์ฑ๋ก ํ์ฅํ ์๋ฏธ์ด๋ค.Array<Array<T>>
๋Array<T>
์ ๊ฐ์ด ๊ฐ์ฃผ๋ ์ ์๋ค.- ์์์๋ ๋งํ๋ฏ ์์ ํ ์ ์ฌ์์ ๋ถ๊ฐ๋ฅํ๋ค.
- ์ฐจ์ ์ถ์์ ๊ฐ๋ ์ด๊ธฐ ๋๋ฌธ.
- ํ์ง๋ง ์๋ฏธ๋ก ์ ์ผ๋ก ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ ๋ณด์กดํ ์ ์๋ค.
- ์ถ๊ฐ์ ์ผ๋ก ์์์ ๊ฐ๋ ๊น์ง ๋ ผ๋ฆฌ์ ๊ด๊ณ๋ฅผ ๋ณด์กดํ๋ ๊ฒ์ด ๋ ์ ํํ๊ฒ ๋ค.
์ค์ ์ ๊ฒฐ๋ก
๋ชจ๋๋๋ ์ด๋ ํ ๊ฐ๋ ์ ๋ํ ๋ ผ๋ฆฌ์ ํ์ฅ์ผ๋ก, ์ค์ง ํ๋ฒ๋ง ์๋ฏธ์๊ฒ ์ ์ฉ ๊ฐ๋ฅํ ๊ฒ๋ค์ ํต์นญํ๋ ๊ฐ๋ ์ด๋ค.
M
์ด Monad๋ผ๋ฉด,
T
์ ์๋ฏธ๋ฅผ ํ์ฅํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์ ์๋์ด ์์ด์ผ ํ๋ค.- ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์ฌ์ฐจ ํ์ฅํ์ ๊ฒฝ์ฐ, ๋ค์์ ์๋ฏธ๊ฐ ์์ด์ผ ํ๋ค. a. ์๋ฏธ ์๊ฑฐ๋ b. ์๋ฏธ๊ฐ ๊ฐ๊ฑฐ๋ c. ์ด๋ค ๊ด์ ์์๋ ๊ฐ๋ค๊ณ ๋ณผ ์ ์์
๊ตฌํ
- ์ด์์ ์ผ๋ก๋ ์์ ํด๋์ค ์ ์ํด์ ํ๋ ๊ฒ ๋ง๋ค.
- ํ์ง๋ง ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฐ๋ผ ์ด ๊ตฌํ์ ๋ฌ๋ผ์ง๋ค.
- ๋ณดํต ํ์
๋ด์ ์ฐ์ฐ์ ์ถ๊ฐํ์ฌ (
flatMap
) ๊ตฌํํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.