Monad์ Functor ์ฌ์ด์๋ Monoidal Functor๋ผ๋ ์ค๊ฐ ๋จ๊ณ๊ฐ ์๋ค.
Monoidal Functor๋ฅผ ์ ์ํ ์ ์๋ ์ธ์ด
์๋ฌด ์ธ์ด์์๋ ์ ์๋ ์ ์๋ ๊ฐ๋
์ ์๋๋ค. ๋ค์์ ์กฐ๊ฑด์ด ์ ํ๋์ด์ผ ํ๋ค.
- Empty Type ()_0 ์ ์ ๊ณตํด์ผ ํ๋ค.
Void
()
- C์์ ๋น ๊ตฌ์กฐ์ฒด ๋ฑ
T, U
ํ์
์ ๋ํ Pair๋ฅผ ๋ง๋ค ์ ์๋ ํํ ํ์
(T,U)_2๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
- ํํ ํ์
๊ณผ ๋น ํ์
์ ๋ค์์ ํจ์๋ฅผ ์ ๊ณตํด์ผ ํ๋ค.
empty
: ()โ()_0 - ๋น ํํ์ ๋ง๋ค์ด์ค
unite
: (T,U)โ(T,U)_2 - ๋ ๊ฐ์ ํํ๋ก ๋ฌถ์ด์ค
e1
: (T,U)_2โT
e2
: (T,U)_2โU
์ฆ, ๋ค์์ ๋ง์กฑํด์ผ ํ๋ค.
unite(e1(u), e2(u)) = u
unite ํ์ํจ์๋ค
n๊ฐ์ ๊ฐ์ n๊ฐ๊ฐ ํ๋์ ํ์
์์ ๋ค์ด๊ฐ๋๋ก ํ๋ unite_n
์ ์์๋ณด์.
์ฆ, n๊ฐ ์ธ์๋ฅผ ํ๋์ ์ธ์๋ก ๋ฐ๊ฟ์ค๋ค.
unite_0 = empty
unite_1 = identity
unite_{n}(t1, ..., tn) = unite(unite_{n-1}(t1, ..., t{n-1}), t{n})
unite3(t1, t2, t3)
= unite1(unite2(t1, t2), t3)
= unite1(unite1(unite1(t1), unite1(t2)), unite1(t3))
- ํ์ง๋ง ์ด ํจ์๋ ์์ ๊ตฌํ์ด swift๋ก ๋ถ๊ฐํ๋ค.
- tuple์ด๋ผ๋ ์๋ฃ๊ตฌ์กฐ์ ์ธ์ ๊ฐ์๋ฅผ ๋ถํน์ ํ ์ํ๋ก ์ ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ตณ์ด ๊ตฌํํด๋ณธ๋ค๋ฉด ์ด๋ฐ ํํ๊ฐ ๋๊ฒ ๋ค.
unite_arg
- ๊ทธ๋ผ ์ด์ ๊ฐ์ ํํ์ ํจ์๋ ๋ง๋ค ์ ์์๊น?
unite_arg_3
: ((T1, T2, T3) -> U) -> (((T1, T2), T3) -> U)
์ฃผ์ด์ง ํจ์๋ง์ผ๋ก ๊ฐ๋ฅํ๋ค.
reassociate_r
reassociate_r
: ((T, U), V) -> (T, (U, V))
reassociate_l
reassociate_l
: (T, (U, V)) -> ((T, U), V)
Monoidal Functor ์ ์
๋ค์์ ๋ง์กฑํ๋ Functor M์ Monoidal Functor๋ผ ํ๋ค. ์ฌ๊ธฐ์ M
์ Monoidal Functor๋ฅผ ์๋ฏธํ๋ค.
pure: T -> M<T>
gather: Tuple(M<T>, M<U>) -> M<Tuple(T, U)>
์ฆ, Functor ์ค์์, lift๊ฐ ์๋ 33. Generic์ค์ ๊ฐ์ 33. Generic์ผ๋ก ํ์ฅํ ์ ์์ผ๋ฉด์
33. Generic์ ํํ์ ํํ์ 33. Generic์ผ๋ก ๋ง๋ค์ด์ค ์ ์๋ ๋
์์ ๋งํ๋ค. Optional์ ์๋ก ์ฝ๋๋ฅผ ์ฒจ๋ถํด๋ณธ๋ค.
Monoidal Functor์ ์กฐ๊ฑด
Conservation of associativity
Conservation of identity element
Monoidal Functor์ ๋ชฉ์
๋ค์ธ์ ํจ์์ ์์ฐ์ค๋ฌ์ด lift๋ฅผ ์ํจ
- ๊ทธ๋ฐ๋ฐ ์์์ functor๋ง ๊ฐ์ง๊ณ ๋ ๋ค์ธ์ ํจ์์ lift๋ฅผ ์ ์ํ ์ ์์ง ์์๋?
lift2d: ((T, U) -> V) -> ((F<T>, F<U>) -> F<F<V>>)
- ํ์ง๋ง ์ธ์ ๋ฐํ ํ์
์ Generic์ด ์ธ์ ๊ฐ์๋งํผ ๋ค์ด๊ฐ์ ๋์จ๋ค.
lift2: ((T, U) -> V) -> ((M<T>, M<U>) -> M<M<V>>)
- ์ฐ๋ฆฐ ์์ ๊ฐ์ ํํ๋ฅผ ๋ง๋ค๊ณ ์ถ์ ๊ฒ์ด๋ค.
- ํน์
lift0: (() -> U) -> (() -> M<U>)
- ์ด๋ฐ ํํ๋ ์ ์ํด์ ์ฌ์ฉํ๊ณ ์ถ๋ค.
- ์ด๋ฐ ์กฐ๊ฑด์ ์๊ตฌํ๋ค๋ณด๋ ๋์จ๊ฒ Monoidal Functor์ด๋ค.
- Monoidal Functor๊ฐ ์ด๋ป๊ฒ ๋ค์ธ์ ํจ์์ lift๋ฅผ ์ํ๋๋๋ก ๋ง๋ค ์ ์๋์ง ํ์ธํด๋ณด์.
m_unite_{n}
n๊ฐ์ Monoidal functor๋ฅผ ํํ์ ๊ฐ์ผ๋ก ๊ฐ์ง๋ ํํ์
ํ๋์ Monoidal Functor๋ก ๋ง๋๋ ํจ์
m_unite_{n}
(M<T1>, ..., M<T{n}>) -> M<(((T1, T2), T3), ..., T{n})>
m_unite_0 = pure(()) : (() -> M<T>)
m_unite_1(m1) = m1 : (M<T> -> M<T>)
m_unite_n(m1, ..., m{n}) = gather(unite(m_unite_{n-1}(m1, ..., m{n-1}), m{n}))
: (M<T1>, ..., M<T{n}>) -> M<(((T1, T2), T3), ..., T{n})>
- ์์ ๊ฐ์ด ์ฌ๊ท์ ์ผ๋ก ์ ์ํ๋ฉด ๋๋ค.
- ์ด๋ฅผ ํจ์๋ก ๋ฐ๊พธ๋ ๊ฒ์ ์ด๋ ต์ง ์๋ค.
์ฆ, ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๊ฐ ํ ์ผ์ ์ฐ๋ฌ์ ๋์จ n๊ฐ์ ๊ฐ์ nestedํ ํ๋์ ํํ๋ก ๋ฌถ์ ๊ฒ์ด๋ค.
lift_n
- ๊ทธ๋ผ
m_unite_n
์ ๊ฐ์ง๊ณ lift_n
์ ๋ง๋ค์ด๋ณด์.
lift_n
: ((T1, ..., T{n}) -> U) -> (M<T1>, ..., M<T{n}) -> M<U>
- ์ฌ๋ฐ๋ ๊ฑด
lift_n
์ ๊ฐ์ง๊ณ m_unite_n
๋ ๋ง๋ค ์ ์๋ค๋ ๊ฒ์ด๋ค.
mUnite3 = lift3(unite3)
- ์ด ์๊ธฐ๋
mUnite_n
๊ณผ lift_n
์ด ์๋ก๋ฅผ ํตํด ์ ์ํ ์ ์๋ ๋์น ๊ด๊ณ์ ์์์ ์๋ฏธํ๋ค.
pure์ gather
pure
์ gather
์ญ์ lift
๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ๊ฐ๋ฅํ๋ค.
์ ๋ฆฌํด๋ณด์.
- ์๋ 4๊ฐ์ ํจ์๊ฐ ๋์ํ๋ ์ธ์ด์ฌ์ผ Monoidal Functor๋ ์ ์๋๋ค.
Monoidal Functor๊ฐ ๋๊ธฐ ์ํ ์กฐ๊ฑด, ์๋์ ๋ ํจ์๋ง ์ ์๋๋ฉด ๋๋ค.
- ์ด์ํฉ์์ ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์๊ฒ ๋ญ๊น?
- ์ฐ๋ฆฌ๊ฐ ํ๊ณ ์ถ์ ๊ฑด ๋ค์ธ์ ํจ์์ lift๋ฅผ ์ ์ ์ํ๋ ๊ฒ์ด๋ค.
- ((T1, T2, T3) โ U)) โ (T1?, T2?, T3?) โ U? ์ด๋ฐ ํํ.
- ๋จผ์ unite_n์ ์ ์ํ์. n๊ฐ์ ๋ํด์๋ ์๋๋ 3๊ฐ๊น์ง๋ง ํด๋ณด์.
- ๋ค์์ผ๋ก m_unite_n์ ์ ์ํ์.
- ๋ง์ง๋ง ํ๋์ ํจ์๋ง ๋ ์ ์ํ์. uniteArg3.
- ์ด์ lift ํจ์๋ฅผ ๋ง๋ค์ด๋ณด์.
- ๊ทธ๋ฐ๋ฐ lift3๋ก mUnite3์ ํํํ ์ ์๋ค.
- ๋ญ๊ฐ ์ด์ํ๋ค. lift๋ฅผ ์ฐพ์์จ ์ฌ์ ์ธ๋ฐ, ๊ทธ๊ฒฐ๊ณผ๋ก ์์ ์ ์ ์ํ ์ ์๋ค๋.
- ์ฆ ๋์น์ธ ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฒฌํ ๊ฒ์ด๋ค.
๋์น ๊ตฌ์กฐ
- ์ด ๋ถ๋ถ์์ ๋งํ์ ์ฌ๋ฌ๊ฐ์ง ์๋๋ฅผ ํด๋ณด์๋ค.
- ๋ง์ง์ ๊ฑฐ๋ ค๋ณด๋ฉด, ํจ์๋ค์ด ์๋ก ์ํํ๋ฉด์ ๋ด๊ฐ ์ ์๋๊ธฐ ์ํด์๋ ๋ค๋ฅธ ํจ์๊ฐ ์๊ตฌ๋๋ ์ํฉ์ด ํผ์ณ์ง๋ค.
๊ฒฐ๋ก
Monoidal Functor๋ Functor๊ฐ lift_n์ ๊ฐ๊ธฐ ์ํ ํ์์ถฉ๋ถ์กฐ๊ฑด์ด๋ค.
- Monoidal Functor๋
pure
, gather
๋ง ์ ์ํ๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ํฉ์์
lift_n
์ด ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ผด๋ก ์ ์๋๋์ง ํ์ธํด๋ดค๋ค.
- ๊ทธ๋ฌ๋๋
lift_n
์ด ์ ์ ์๋์๋ค!
ํน์.
lift_n
์ด ์ ์๋๋ ์กฐ๊ฑด์ ์ฐพ์๋ค.
- ๊ทธ๋ด ๊ฒฝ์ฐ
pure
, gather
ํจ์๋ ๋ฌด์กฐ๊ฑด ๋ง์กฑํ๋ค.
- ์ฆ, Monoidal Functor๋ ๋ค์ธ์ ํจ์์ lift๋ฅผ ์ํ๋ ๊ผด๋ก ๋ง๋๋ ๋
์์ด๋ค.
์์ชฝ ๋ชจ๋ ๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ๊ณ ์๋ค. ์ด ๊ฒฐ๊ณผ๋ฅผ ํตํด Monoidal Functor๊ฐ Functor์ Monad ์ฌ์ด ๋ฒ์ฃผ์ ํด๋นํ๋ ๋
์์์ ํ์ธํ ์ ์๋ค.
์ ๋ง์ด ์ฌ์ฉ๋์ง ์๋๊ฐ?
- ํจ์ํ ์ธ์ด์์ ๋ค์ธ์ ํจ์์ ์ธ์๋ฅผ ํํ์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ.
- ๋ฐ๋๋ก ๋งํ๋ฉด n-tuple์ ์ ์ง์ํ๋ ์ธ์ด์์๋ ์ด ๊ฐ๋
์ด ์ฃผ๋ฅ๊ฐ ๋์์ ๊ฒ.
- ํํ๋ง๊ณ ํจ์ํ ์ธ์ด ํ๊ฒฝ์์ ๋ ์ ํ์ฉ๋ ์ ์์ ๋งํ ๊ฐ๋
์ ๋ฃ์ ์ ์๋๋ฐ,
apply: M<T->U> -> (M<T>->M<U>)
์ด๋ค.
- ํด๋น ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์์ด ๊ณง 10. Applicative Functor์ด๋ค.
Reference