Functors | Mark Seemann

functor(ํŽ‘ํ„ฐ)๋Š” ์ผ๋ฐ˜์ ์ธ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ๊ด€๋ จ์ด ์žˆ์ง€๋งŒ functor๋Š” C#์—๋„ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ๋Š” functor, applicative ๋ฐ ๊ธฐํƒ€ ๋งคํ•‘ ๊ฐ€๋Šฅํ•œ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•œ ๋” ํฐ ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค .

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์ถ”์ƒํ™”์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํšŒ๋กœ ๊ธฐํŒ์˜ ๊ฐœ๋ณ„ ์•„์›์ž ์ž…์ž๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ถ”์ƒํ™”๋Š” ์ˆ˜ํ•™์— ๋ฟŒ๋ฆฌ๋ฅผ ๋‘๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฒ”์ฃผ ์ด๋ก  ์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋น„์˜ฅํ•œ ๊ธฐ๋ฐ˜์ž„์ด ์ž…์ฆ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ”์ฃผ ์ด๋ก ์˜ ์ผ๋ถ€ ๊ฐœ๋…์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—๋„ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. C#๊ณผ Java์˜ ๊ธฐ๋Šฅ์ธ ์ œ๋„ค๋ฆญ๋งŒ ์žˆ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด์ „ ๊ธฐ์‚ฌ์—์„œ ํŠน์ • ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ๋นŒ๋” ๋ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ๊ธฐ functor์— ๋Œ€ํ•ด ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค . functor๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ endofunctors ๋ผ๊ณ  ํ•˜๋Š” functor์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์œผ๋กœ ์ž‘์—…ํ•˜์ง€๋งŒ ์ธ์‹ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ผ๋ฐ˜์  ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ์ƒ์ ์ธ ๋Œ€ํ™”์—์„œ๋Š” ๊ทธ๋ƒฅ functor ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค .

๋‹ค์Œ ๊ธฐ์‚ฌ ์‹œ๋ฆฌ์ฆˆ์—์„œ๋Š” C#, F# ๋ฐ Haskell์˜ ์ฝ”๋“œ ์˜ˆ์ œ์™€ ํ•จ๊ป˜ Ffnctor์˜ ๋งŽ์€ ์˜ˆ์ œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ์‚ฌ๋Š” ๋Œ€๋ถ€๋ถ„ ๊ฐœ๋…์— ๋Œ€ํ•ด ๊ถ๊ธˆํ•œ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ชฉ๋ก์€ ์™„์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ functor๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ชจ๋“  functor ์ค‘ ๊ฐ€์žฅ ์ž˜ ์•Œ๋ ค์ง„ ๊ฒƒ์€ Sequence๋ผ๊ณ ๋„ ํ•˜๋Š” List์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. C# ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์€ ๋ชจ๋“  functor๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์€ functor์™€ ๊ด€๋ จ๋œ ์–ธ์–ด ๊ธฐ๋Šฅ์œผ๋กœ๋งŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค IEnumerable<T> . IEnumerable<T> ๋ฐ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ ์˜ ์กฐํ•ฉ ์€ ์ด๋ฏธ ์ž˜ ์„ค๋ช…๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ช…์‹œ์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ LINQ, IEnumerable<T> ๋ฐ C# ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ด ์ž‘๋™ ํ•˜๋Š” ๋ฐฉ์‹์„ ์ดํ•ดํ•œ๋‹ค๋ฉด ๋‹ค๋ฅธ ๋ชจ๋“  functor๋Š” ์ง๊ด€์ ์œผ๋กœ ๋Š๊ปด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ์ถ”์ƒํ™”์˜ ํž˜์ž…๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ด๋Ÿฐ ๋ฅ˜์˜ ๋‚ด์šฉ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹นํ•œ ์ด๋ก ์ ์ธ ๊ธฐ๋ฐ˜์ด ํ•„์š”ํ•˜์—ฌ ์–ด๋ ต๊ณ , ๊ทธ๊ฒƒ์„ ์ฝ”๋”ฉ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋”๋”์šฑ๋” ์ˆ™๋‹ฌ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํŒŒํŽธ์ ์œผ๋กœ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์ฝ”๋”ฉ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์œ ์ตํ•˜๋ฉฐ, ์ด๋ฏธ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ์œ ์šฉํ•œ ์ฝ”๋“œ์กฐ๊ฐ์ด ์ด๋Ÿฌํ•œ ์ด๋ก ์  ๋ฐ”ํƒ•์—์„œ ์‹œ์ž‘ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. functor์™€ ๊ด€๋ จ๋œ ์ƒ์œ„ ๊ธ€๋“ค์„ ๋Œ“๊ธ€๋กœ ์ถ”๊ฐ€ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2๊ฐœ์˜ ์ข‹์•„์š”

Fuinctors๋ž€?

2๊ฐœ์˜ ์ข‹์•„์š”

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋ฅผ ์œ„ํ•œ ๋ฒ”์ฃผ ์ด๋ก 

1๊ฐœ์˜ ์ข‹์•„์š”

PDF ๋ฒ„์ ผ

1๊ฐœ์˜ ์ข‹์•„์š”