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>๋กœ ๋ฐ”๊พธ๋Š” ๋ณ€ํ™˜์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

์˜๋ฏธ๋ก ์  ๊ณ ์ฐฐ์˜ ๊ฒฐ๋ก 

  • ์œ„์—์„œ ํ•œ ์ž‘์—…์€ ๋ชจ๋‚˜๋“œ์˜ ์ •์˜๋ฅผ ํ† ๋Œ€๋กœ ๋„์‹ํ™”ํ•œ ๋’ค, ๊ทธ ์˜๋ฏธ๋ฅผ ์ฐพ์•„๋ณด๋Š” ๊ณผ์ •์ด์—ˆ๋‹ค.
  • ์ด ๊ฒฐ๊ณผ ์–ป์–ด์ง€๋Š” ์˜๋ฏธ๋ก ์  ๊ฒฐ๋ก ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  1. M<T>๋Š” T์˜ ์˜๋ฏธ๋ฅผ ํ™•์žฅํ•œ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ํƒ€์ž…์ด์–ด์•ผ ํ•œ๋‹ค. (unit)
  2. 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๋ผ๋ฉด,

  1. T์˜ ์˜๋ฏธ๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์ •์˜๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค.
  2. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์žฌ์ฐจ ํ™•์žฅํ–ˆ์„ ๊ฒฝ์šฐ, ๋‹ค์Œ์˜ ์˜๋ฏธ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค. a. ์˜๋ฏธ ์—†๊ฑฐ๋‚˜ b. ์˜๋ฏธ๊ฐ€ ๊ฐ™๊ฑฐ๋‚˜ c. ์–ด๋–ค ๊ด€์ ์—์„œ๋Š” ๊ฐ™๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Œ

๊ตฌํ˜„

  • ์ด์ƒ์ ์œผ๋กœ๋Š” ์ƒ์œ„ ํด๋ž˜์Šค ์ •์˜ํ•ด์„œ ํ•˜๋Š” ๊ฒŒ ๋งž๋‹ค.
  • ํ•˜์ง€๋งŒ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๋”ฐ๋ผ ์ด ๊ตฌํ˜„์€ ๋‹ฌ๋ผ์ง„๋‹ค.
  • ๋ณดํ†ต ํƒ€์ž… ๋‚ด์— ์—ฐ์‚ฐ์„ ์ถ”๊ฐ€ํ•˜์—ฌ (flatMap) ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

Optional

unit

extension Optional {
    internal func unit(_ t: T) -> T? {
        .some(t)
    }
}

flat

extension Optional {
    internal func flat<T>(_ oot: Optional<Optional<T>>) -> Optional<T> {
        switch oot {
        case .none:
            return .none
        case .some(let ot):
            return ot
        }
    }
}

Reference