์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
main = putStrLn "Hello, world!"


1. ๊ฐœ์š”2. ๋“ฑ์žฅ๋ฐฐ๊ฒฝ๊ณผ ์—ญ์‚ฌ3. ํŠน์ง•
3.1. Currying3.2. ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด3.3. ๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ3.4. ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”์ •3.5. ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…3.6. Parametric polymorphism3.7. ๋ชจ๋‚˜๋“œ
4. ์ˆ˜ํ•™๊ณผ์˜ ๊ด€๋ จ์„ฑ5. ์•ˆ ์จ์š”6. ํ•˜์Šค์ผˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ๋“ค7. ๊ธฐํƒ€

1. ๊ฐœ์š”[ํŽธ์ง‘]


ํ•˜์Šค์ผˆ์˜ ๋กœ๊ณ . ๋น„์Šทํ•˜๊ฒŒ ๋‹ค๋ฅธ ๋ฐฐ์ƒ‰์œผ๋กœ ํ•œ ๋””์ž์ธ์„ ์ฐพ์•„๋ณด๋ฉด ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋กœ๊ณ ๋Š” ๋žŒ๋‹ค ๋Œ€์ˆ˜์—์„œ์˜ ฮป์™€ ๋ชจ๋‚˜๋“œ์— ์‚ฌ์šฉํ•˜๋Š” bind ์—ฐ์‚ฐ์ž์ธ >>=๋ฅผ ๊ฒน์ณ๋†“์€ ์ด๋ฏธ์ง€๋‹ค.

์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด.[1] I/O์™€ ๊ฐ™์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด Side Effect๊ฐ€ ์—†๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ๋งŒ ๋งŒ๋“ค์–ด์กŒ๋‹ค.

๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ํ•˜์Šค์ผˆ ์ปดํŒŒ์ผ๋Ÿฌ๋กœ๋Š” GHC๊ฐ€ ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์— ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋ฅผ ์ถ”๊ฐ€ํ•œ ํ”Œ๋žซํผ์ด Stack์ด๋‹ค. Stack์„ ์„ค์น˜ํ•˜๋ฉด GHC๋„ ํ•จ๊ป˜ ์„ค์น˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†์„ ๊ฒฝ์šฐ Stack์„ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

2. ๋“ฑ์žฅ๋ฐฐ๊ฒฝ๊ณผ ์—ญ์‚ฌ[ํŽธ์ง‘]

ํ•˜์Šค์ผˆ์€ 1985๋…„ ๋“ฑ์žฅํ•œ ๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ๋ฏธ๋ž€๋‹ค[2]์˜ ๋’ค๋ฅผ ์ด์–ด, ์ƒ์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๋”ฐ์œ„๊ฐ€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ๊ฒƒ์ด ๋งˆ์Œ์— ์•ˆ๋“œ๋Š” ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์™€ ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜ ์—ฐ๊ตฌ ํ•™์ˆ ํšŒ์—์„œ 1987๋…„๋ถ€ํ„ฐ ์„ค๊ณ„๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ์–ธ์–ด์˜ ์ด๋ฆ„์ธ ํ•˜์Šค์ผˆ์€ ๋…ผ๋ฆฌํ•™์ž ํ•˜์Šค์ผˆ ์ปค๋ฆฌ์˜ ์ด๋ฆ„์—์„œ ๊ฐ€์ ธ์™”๋‹ค. ๋ชฉํ‘œ๋Š” ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์›ํ˜•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ํ•™์ˆ ์กฐ์ง์ด ์ฃผ๋„ํ•œ ์–ธ์–ด๋‹ต๊ฒŒ ๋””์ž์ด๋„ˆ๊ฐ€ ๋‹ค ํƒ€๋ ค๋ฉด ๋ฏธ๋‹ˆ๋ฒ„์Šค๊ฐ€ ํ•„์š”ํ•  ์ •๋„๋กœ ๋งŽ๊ณ , ๊ฐœ๋ฐœ์†๋„๋Š” ํ‹ฐ์Šคํ‘ผ ๊ณต์‚ฌ๋งŒํผ์ด๋‚˜ ๋А๋ฆฌ๋‹ค๋Š” ํŠน์ง•์ด ์žˆ์—ˆ๋‹ค(...). ํ•˜์—ฌ๊ฐ„ ์ตœ์ดˆ ๋…ผ์˜๋กœ๋ถ€ํ„ฐ 3๋…„ ๋’ค์ธ 1990๋…„ 4์›” 1์ผ[3], 1.0 ๋ฒ„์ „[4]์˜ ๋ณด๊ณ ์„œ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ๊ณ , 1.1~1.4 ๋ฒ„์ „์„ ๊ฑฐ์ณ, 1999๋…„์— ๊ฐ€์žฅ ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๋ฒ„์ „์ธ ํ•˜์Šค์ผˆ 98 ๋ณด๊ณ ์„œ๊ฐ€ ๋‚˜์™”๋‹ค.[5] 2016๋…„ ์‹œ์ ์—์„œ ์ตœ์‹  ์ •์˜๋Š” ํ•˜์Šค์ผˆ 2010์ด๋‹ค. ๋‹ค๋งŒ ํ•˜์Šค์ผˆ 2010 ์—ญ์‹œ ๊ทธ๋ฆฌ ๋ฐ”๋€๊ฒƒ์€ ์—†๋‹ค. 2016๋…„ 4์›” Haskell 2020 ์œ„์›ํšŒ๊ฐ€ ์ถœ๋ฒ”ํ•˜์˜€๋‹ค! ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฐ˜์˜๋  ์ปดํŒŒ์ผ๋Ÿฌ ๋ฒ„์ „๊นŒ์ง€ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋Š”๋ฐ ์ด๋ฒˆ์—๋Š” ๋‚ ์งœ๋ฅผ ์ง€ํ‚ฌ๊นŒ....

3. ํŠน์ง•[ํŽธ์ง‘]

๋ฉ”์ธ์ŠคํŠธ๋ฆผ ์–ธ์–ด์ธ C/C++/C#/Java/Python ๋“ฑ์€ ๊ฐ ์–ธ์–ด๋งˆ๋‹ค์˜ ํŠน์ง•๋“ค์„ ๊ฐ–๊ณ  ์žˆ๊ธด ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ์–ธ์–ด์ ์œผ๋กœ ๊ณผ๊ฑฐ ์‚ฌ์šฉ๋˜๋˜ ์–ธ์–ด๋“ค์— ๋น„ํ•ด ํฐ ํ˜์‹ ์„ ๊ฐ€์ ธ์™€์„œ ์œ ๋ช…ํ•ด์ง„ ์–ธ์–ด๋“ค์€ ์•„๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ ์–ธ์–ด์  ๊ด€์ ์—์„œ ํ˜์‹ ๊ณผ ํ•จ๊ป˜ ์–ด๋А์ •๋„ ์œ ๋ช…์„ธ๋ฅผ ํƒ„ ์–ธ์–ด๋Š” ์ €๋“ค๋ณด๋‹ค๋Š” ์ฐจ๋ผ๋ฆฌ Fortran, Simula, Lisp, Prolog ์ •๋„๋ฅผ ๊ผฝ์„ ์ˆ˜ ์žˆ๊ณ  Haskell์€ Purity, Non-strict semantics[6], Monad ๋“ฑ ๋‹น์‹œ ๊ธฐ์ค€์œผ๋กœ๋Š” ์ข€ ๊ทน๋‹จ์ [7]์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ๋””์ž์ธ์œผ๋กœ ์œ ๋ช…ํ•˜์˜€๋‹ค.

3.1. Currying[ํŽธ์ง‘]

์ˆ˜ํ•™/๋…ผ๋ฆฌํ•™์ž์ธ ํ•˜์Šค์ผˆ ์ปค๋ฆฌ(Haskell Curry)๋Š” ์˜ค๋Š˜๋‚  ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ปจ์…‰ ์ค‘ ํ•˜๋‚˜๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š” Currying์œผ๋กœ ์œ ๋ช…ํ•œ๋ฐ, ์ด Currying์€ ์‚ฌ์‹ค ํ•˜์Šค์ผˆ๋งŒ์˜ ํŠน์ง•์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๊ฐ€ ๊ณต์œ ํ•˜๋Š” ํŠน์ง•์ด๊ธฐ๋„ ํ•˜๋‹ค. Currying์€ ๋‹ค์ธ์ž ํ•จ์ˆ˜์˜ ๋ณ€์ˆ˜(parameter)๋ฅผ ์ชผ๊ฐœ๊ธฐ๋กœ ์ƒ๊ฐํ•˜๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค. ์ฆ‰, ๋‹ค๋ณ€์ˆ˜ ํ•จ์ˆ˜(์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ’์„ ๋ฌถ์–ด์„œ ํ•œ๊บผ๋ฒˆ์— ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜)๋ฅผ ์ผ๋ณ€์ˆ˜ ํ•จ์ˆ˜(๊ฐ’์„ ํ•˜๋‚˜์”ฉ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜) ์—ฌ๋Ÿฌ๊ฐœ๋กœ ์ชผ๊ฐœ๋Š” ๊ฒƒ์ด๋‹ค.[8] ์˜ˆ๋ฅผ๋“ค์–ด, f(x,y)๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ g_x (y)๋กœ ๋ฐ”๊พธ๋Š”๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ g_x ํ•จ์ˆ˜๋Š” ์ด๋ฆ„์ฒ˜๋Ÿผ ๊ณ ์ •๋œ ๊ฒŒ ์•„๋‹ˆ๋ผ, x ๊ฐ’์— ๋”ฐ๋ผ ์ •ํ•ด์ง„๋‹ค. ๋”ฐ๋ผ์„œ g_x (y)์—๋Š” y๋ฅผ ๋ฐ›์•„ ๊ฒฐ๊ณผ๊ฐ’์„ ๋Œ๋ ค์ฃผ๋Š” g_x (y) ํ•จ์ˆ˜์™€, x๋ฅผ ๋ฐ›์•„ g_x ์ž์ฒด๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ผ๋Š” 2๊ฐœ์˜ ์ผ๋ณ€์ˆ˜ ํ•จ์ˆ˜๊ฐ€ ์ค‘์ฒฉ๋˜์–ด ๋“ค์–ด ์žˆ๋‹ค. ํ˜น์€ (g(x))(y)๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ๋œ๋‹ค.

๋ณด๋‹ค ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ๋“ค์–ด ๋ณด์ž. 3*2์—์„œ *๋ฅผ ๋‘๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋ณดํ†ต ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์“ด๋‹ค๋ฉด *(3,2)์ด๋ผ๊ณ  ์“ฐ๋ฉด ๋  ๊ฒƒ์ด๋‹ค. ์ฆ‰ * ํ•จ์ˆ˜๊ฐ€ 3๊ณผ 2์˜ ์Œ์„ ํ•œ๋ฒˆ์— ๋ฐ›์•„์„œ 6์„ ๋Œ๋ ค์ฃผ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์„œ ๊ทธ ์ž…๋ ฅ๊ฐ’์˜ 3๋ฐฐ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒƒ๋„ ํ•จ์ˆ˜์ด๋ฏ€๋กœ, ๊ทธ ํ•จ์ˆ˜๋ฅผ (ร—3)์ด๋ผ๊ณ  ํ‘œ์‹œํ•ด ๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด (ร—3)(2) ๋ผ๋Š” ํ‘œํ˜„๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์„œ ๊ทธ ์ž…๋ ฅ๊ฐ’์˜ 4๋ฐฐ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ (ร—4)๋ผ๊ณ  ํ‘œ์‹œํ•œ๋‹ค๋ฉด, (ร—4)(3) ๊ฐ™์€ ์‹๋„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ์ด๋Ÿฐ ์‹์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•ด์„œ ์ž…๋ ฅ๊ฐ’์„ ๋ฐ›์•„์„œ ๊ทธ ์ž…๋ ฅ๊ฐ’์˜ m๋ฐฐ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ (ร—m)์ด๋ผ๊ณ  ์จ ๋ณด์ž.

๊ทธ๋Ÿฌ๋ฉด *(m,n)=(ร—m)(n) ์ด๋ผ๋Š” ์ผ๋ฐ˜์‹์ด ์„ฑ๋ฆฝํ•œ๋‹ค. ์ด ์‹์˜ ์šฐ๋ณ€์— ์ผ๋ณ€์ˆ˜ ํ•จ์ˆ˜ 1๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์™œ๋ƒํ•˜๋ฉด ร—๋Š” m์„ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„์„œ (ร—m)์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ขŒ๋ณ€์—๋Š” ์ด๋ณ€์ˆ˜ํ•จ์ˆ˜ *, ์šฐ๋ณ€์—๋Š” ์ผ๋ณ€์ˆ˜ํ•จ์ˆ˜ ร—์™€ (ร—m)์ด ์žˆ๋‹ค๊ณ  ๋ณด์•„์•ผ ํ•œ๋‹ค.[9]

์ด๋Ÿฐ ์‹์œผ๋กœ, ๋ชจ๋“  ์ด๋ณ€์ˆ˜ํ•จ์ˆ˜๋Š” ์ผ๋ณ€์ˆ˜ํ•จ์ˆ˜ ํ•˜๋‚˜์™€ ๊ทธ ์ผ๋ณ€์ˆ˜ํ•จ์ˆ˜๋ฅผ ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ ๋‚ด๋†“๋Š” ๋‹ค๋ฅธ ์ผ๋ณ€์ˆ˜ํ•จ์ˆ˜์˜ ์กฐํ•ฉ์œผ๋กœ ๋ถ„ํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ๊ฒƒ์„ currying์ด๋ผ๊ณ  ํ•˜๋ฉฐ, ํƒ€์ž…์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜๋„ ์žˆ๋‹ค.

*(m,n)์€ (int, int) โ†’ int ๋ผ๋Š” ํƒ€์ž…์„ ๊ฐ€์ง€๊ณ , ์ด๋Š” * ํ•จ์ˆ˜๊ฐ€ ์ •์ˆ˜์˜ ์Œ์„ ๋ฐ›์•„์„œ ์ •์ˆ˜๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ํ•œํŽธ (ร—m)(n)์˜ ํƒ€์ž…์€ int โ†’ (int โ†’ int)๊ฐ€ ๋˜๊ณ , ์ด๋Š” ร— ํ•จ์ˆ˜๊ฐ€ ์ •์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ํ•จ์ˆ˜๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜์ธ๋ฐ ร—๊ฐ€ ๋Œ๋ ค์ค€ ํ•จ์ˆ˜๋Š” ์ •์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ์ •์ˆ˜๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ํ•จ์ˆ˜๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.[10]

์ด๋ ‡๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜์Šค์ผˆ์—์„œ๋Š” ๊ทธ๋ƒฅ * 3 2 ๋ผ๊ณ  ์“ฐ๊ณ , *๊ณผ 3 ์‚ฌ์ด์—์„œ ๋Š์–ด ์ฝ์œผ๋ฉด *(3,2) ๊ฐ€ ๋˜๊ณ  3๊ณผ 2 ์‚ฌ์ด์—์„œ ๋Š์–ด ์ฝ์œผ๋ฉด (ร—3)(2) ๊ฐ€ ๋œ๋‹ค๋Š” ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. * 3 2 ๋ผ๋Š” ํ‘œ๊ธฐ ์ž์ฒด๊ฐ€ currying์„ ๋ฐ˜์˜ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์ด๋Ÿฐ currying ๋•์— ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด์„œ๋„ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•ด์ง€๊ณ , ํ’๋ถ€ํ•œ ์˜๋ฏธ๋ฅผ ๋‹ด์„ ์ˆ˜๋„ ์žˆ๊ฒŒ ๋œ๋‹ค.[11] ๋ง๋ถ™์—ฌ ์œ„์˜ * 3 2 ๋Š” ๊ทธ๋ƒฅ ์„ค๋ช…์„ ์œ„ํ•œ ์˜ˆ์‹œ์ด๊ณ , ์‹ค์ œ ํ•˜์Šค์ผˆ์—์„œ๋Š” (*) 3 2๋กœ ์“ฐ๊ฑฐ๋‚˜ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ *์„ ์ค‘์œ„ ์—ฐ์‚ฐ์ž๋กœ ์ทจ๊ธ‰ํ•˜์—ฌ 3*2๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.

Currying๊ณผ ์—ฐ๊ด€๋œ ์ง‘ํ•ฉ๋ก ์  ๋‚ด์šฉ๋„ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. Aร—B๋ฅผ ์•ž์ž๋ฆฌ๋Š” A์˜ ์›์†Œ, ๋’ท์ž๋ฆฌ๋Š” B์˜ ์›์†Œ์ธ ์ˆœ์„œ์Œ์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ •์˜ํ•˜๊ณ  D^C๋ฅผ C์—์„œ D๋กœ์˜ ํ•จ์ˆ˜์˜ ์ง‘ํ•ฉ์œผ๋กœ ์ •์˜ํ•˜๋ฉด, C^(Aร—B)์™€ (C^B)^A ์‚ฌ์ด์—๋Š” ๋งค์šฐ ์ ์ ˆํ•œ ์ผ๋Œ€์ผ ๋Œ€์‘์ด ์กด์žฌํ•œ๋‹ค. ์ด์—์„œ ์ง‘ํ•ฉ์˜ ๊ธฐ์ˆ˜ ๋˜๋Š” ๋†๋„(Cardinal number, cardinality) ์˜ ์ง€์ˆ˜๋ฒ•์น™์˜ ์ผ๋ถ€๋„ ์ฆ๋ช…๋œ๋‹ค.

Currying ์€ type inference ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ, ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ณจ์น˜์ฉ์ผ ํ•„์š” ์—†์ด ์•Œ์•„์„œ ์ ์šฉ๋œ๋‹ค. Currying ์€ ์–ธ๋œป๋ณด๊ธฐ์— ๋ณ„ ์“ธ๋ชจ์—†์–ด๋ณด์ด์ง€๋งŒ, ์‚ฌ์‹ค ์ด๊ฒŒ ๋น ์ง„ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋Š” ํฌ์ธํ„ฐ ์—†๋Š” C ์–ธ์–ด๋ผ ๋ด๋„ ๋ฌด๋ฐฉํ• ์ •๋„๋กœ ํ•ต์‹ฌ์ ์ธ ์œ„์น˜๋ฅผ ๊ฐ–๋Š”๋‹ค.๊ทธ๋ž˜์„œ ์–ธ์–ด ์ด๋ฆ„๋„ ํ•˜์Šค์ผˆ

3.2. ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด[ํŽธ์ง‘]

๋ณดํ†ต ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์œผ๋กœ๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ(Side Effect)๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ๊ผฝ๋Š”๋‹ค. ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค ์ด๊ฒƒ์€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ณด๋‹ค๋Š” ์ˆœ์ˆ˜ ์„ ์–ธํ˜• ์–ธ์–ด(Declarative language)์˜ ํŠน์ง•์— ๊ฐ€๊น๋‹ค. ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋Š” ์ˆœ์ˆ˜ ์„ ์–ธํ˜• ์–ธ์–ด์˜ ํ•˜์œ„ ์นดํ…Œ๊ณ ๋ฆฌ๋ผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ ํ•จ์ˆ˜๋Š” ์ˆ˜ํ•™์—์„œ์˜ ํ•จ์ˆ˜์™€ ๊ฐ™์•„์„œ ๋ถ€์ˆ˜ํšจ๊ณผ(๋˜๋Š” ๋ถ€์ž‘์šฉ. Side Effect)๊ฐ€ ์—†๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ํŒŒ๋ผ๋ฏธํ„ฐ(parameter)๋กœ ๋„˜๊ฒจ์ง„ ์ž…๋ ฅ๊ฐ’์— ์˜ํ•ด์„œ๋งŒ ๊ฒฐ์ •๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ž€, ๊ฐ™์€ ์ž…๋ ฅ์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ถœ๋ ฅ์ด ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ž๋™์ฐจ๋ฅผ ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ, ์ฃผ์–ด์ง„ ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒํผ ์ž๋™์ฐจ์˜ ์†๋„๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๊ณ  ํ˜„์žฌ ์†๋„๋ฅผ ์ถœ๋ ฅํ•˜๋Š”, ์ ˆ์ฐจ์ง€ํ–ฅ์ ์œผ๋กœ ์ž‘์„ฑ๋œ accelerate() ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ •ํ•ด ๋ณด์ž. ์˜ˆ๋ฅผ ๋“ค์–ด, accelerate(10)๋Š” ์ž๋™์ฐจ์˜ ์†๋„๋ฅผ 10 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค. ์ž๋™์ฐจ๊ฐ€ ์ •์ง€ํ•ด ์žˆ์„ ๋•Œ accelerate(10)์ด ํ˜ธ์ถœ๋˜๋ฉด ์ž๋™์ฐจ์˜ ์†๋„๋Š” 10 ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ ํ˜„์žฌ ์†๋„๋Š” 10์ด๊ณ , ๋”ฐ๋ผ์„œ ํ˜„์žฌ ์†๋„์ธ 10์ด ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋•Œ ํ•œ ๋ฒˆ ๋” accelerate(10) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ถœ๋ ฅ๊ฐ’์€ 20์ด ๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ state๋ฅผ ๊ฐ€์ง€๋Š” ์ƒํƒœ๋จธ์‹ ์˜ ๊ฒฝ์šฐ, ์ถœ๋ ฅ๊ฐ’์€ ์ž…๋ ฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋จธ์‹ ์˜ ์ƒํƒœ ์—ญ์‹œ ์ถœ๋ ฅ์„ ์ขŒ์šฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ฐ™์€ ์ž…๋ ฅ์ธ๋ฐ๋„ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ๋ถ€์ˆ˜ํšจ๊ณผ๋‹ค.

ํ•˜์ง€๋งŒ ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜๋“ค๋กœ ๊ตฌ์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์€ ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†์–ด ์‹คํ–‰ ์ˆœ์„œ์˜ ์˜ํ–ฅ์—์„œ ์ž์œ ๋กญ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘ํ–‰์„ฑ์„ ๊ฐ€์ง€๊ธฐ ์ข‹๋‹ค. ๋˜ํ•œ ๋ฃจํ”„๋ฌธ์ด ์—†๊ณ  ์ œ์–ด๋ฌธ๋„ ์•„์ฃผ ์ ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ œ์–ด๋ฌธ์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๋ถ„๊ธฐ๋Š” ํŒจํ„ด ๋งค์นญ๊ณผ ๊ฐ€๋“œ์— ์˜ํ•ด ๋งŒ๋“ค์–ด์ง„๋‹ค.

ํ•˜์Šค์ผˆ์€ System.IO.Unsafe ๋ชจ๋“ˆ์˜ unsafePerformIO[1] ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ๋กœ ๋ญ ํ•  ๋•Œ ๋นผ๊ณ ๋Š” ๋ˆ„๊ตฌ๋„ ์•ˆ ์“ด๋‹ค. ์‚ฌ์‹ค ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์“ฐ๋ฉด ์•ˆ๋˜๋Š” ํ•จ์ˆ˜๋“ค์ด๋‹ค. ๋“ฑ์„ ์ œ์™ธํ•˜๋ฉด ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋กœ ๊ทœ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

3.3. ๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ[ํŽธ์ง‘]

๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ(Lazy Evaluation)์€ ๊ณ„์‚ฐ์ด ํ•„์š”ํ•œ ์ˆœ๊ฐ„๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋ฏธ๋ฃจ์–ด ๋‘”๋‹ค๋Š” ์˜๋ฏธ๋‹ค. ๋”ฐ๋ผ์„œ ๊ทธ๋•Œ ๊ทธ๋•Œ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด ๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ์˜ ๊ฐœ๋…์œผ๋กœ ์ธํ•˜์—ฌ ํ•˜์Šค์ผˆ์€ ํ”„๋กœ๊ทธ๋žจ์— ๋ฌดํ•œ์˜ ๊ฐœ๋…์„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค ๊ธธ์ด์˜ ์ •์ˆ˜ ์ œ๊ณฑ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ๋ฌดํ•œํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ฒŒ ํ•ด๋„ ์ƒ๊ด€ ์—†๋‹ค.
-- ๋ฌดํ•œํ•œ ์ •์ˆ˜์˜ ์ œ๊ณฑ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š”, ํ•˜์Šค์ผˆ์—์„œ๋Š” ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•(List Comprehension์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.)
-- (๋ณด๋ฉด ์•Œ๊ฒ ์ง€๋งŒ, ์ˆ˜ํ•™์—์„œ์˜ ์ง‘ํ•ฉ { xยฒ | xโˆˆ{1, ..} } ์™€ ์œ ์‚ฌํ•˜๋‹ค.)
square = [x^2 | x โ† [1..]]


์œ ์‚ฌํ•œ ๋ฐฐ์—ด์„ ๋งŒ๋“œ๋Š” JavaScript ์ฝ”๋“œ.

// ์ „ํ˜•์ ์ธ ๋ฌดํ•œ๋ฃจํ”„
var square = []
var i = 1
while (true) {
  square.push(i*i);
  i += 1;
}

// ECMAScript 6์˜ ์ œ๋„ˆ๋ ˆ์ดํ„ฐ(Generator)๋ฅผ ์ด์šฉํ•œ ๋ฒ„์ „
function* square_gen(){
  var i = 1;
  while(true){
    yield i*i;
    i++;
  }
}
var square = square_gen();
console.log(square.next().value);
console.log(square.next().value);
console.log(square.next().value);

์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ๋Š” ์งค์—†์ด ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ๋‹ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์งˆ ๋ฒ„๊ทธ ์ฝ”๋“œ์ง€๋งŒ[2] ๋А๊ธ‹ํ•œ ๊ณ„์‚ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ๋Š” ์ด๋Ÿฐ ๊ฒฝ์šฐ ๊ฐ’์ด ํ•„์š”ํ•ด์ง€๊ธฐ ์ „๊นŒ์ง€ ๊ณ„์‚ฐ์„ ๋ฏธ๋ฃจ๊ณ  ์žˆ๋‹ค๊ฐ€ ๊ฐ’์„ ์š”์ฒญํ•  ๋•Œ ๊ณ„์‚ฐ์„ ํ•ด์„œ ๋ณด๋‚ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค. ์˜คํžˆ๋ ค ์ด๋ ‡๊ฒŒ ์ •์˜ํ•ด๋‘๋ฉด ํ•„์š”ํ•  ๋•Œ ํ•„์š”ํ•œ ๋งŒํผ ๋™์ ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ์œ ์—ฐํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฌดํ•œ์„ ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์ด ๊ถŒ์žฅ๋œ๋‹ค.

๊ณ„์‚ฐ ๋ง๊ณ  ํŒจํ„ด๋งค์นญ์—์„œ๋„ ๋А๊ธ‹ํ•œ ํŒจํ„ด๋งค์นญ์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋Š”๋ฐ, ๋А๊ธ‹ํ•œ ํŒจํ„ด๋งค์นญ์ด๋ž€ ํŒจํ„ด์ด ์•ˆ๋งž์•„๋„ ์ผ๋‹จ ์ฐธ์œผ๋กœ ๊ฐ€์ •ํ•ด์„œ ํ†ต๊ณผ์‹œํ‚ค๊ณ , ๊ทธ ํŒจํ„ด์ด ์‹ค์ œ ์‚ฌ์šฉ๋ ๋•Œ๊ฐ€ ๋˜์–ด์„œ์•ผ ํ•ด๋‹น ํŒจํ„ด์˜ ๋ณ€์ˆ˜์— ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š”๊ฒƒ์ด๋‹ค. ๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ~ ๋ฅผ ์•ž์— ๋ถ™์—ฌ ~pattern ์ •๋„๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๋ช‡๋ช‡ ๊ฒฝ์šฐ์—๋Š” ~ ๋ฅผ ๋”ฐ๋กœ ๋ถ™์ด์ง€ ์•Š์•„๋„ ์•”๋ฌต์ ์œผ๋กœ ์ ์šฉ๋œ๋‹ค.

3.4. ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”์ •[ํŽธ์ง‘]

ํ•˜์Šค์ผˆ์€ ํ•จ์ˆ˜์— ์ž…๋ ฅ, ์ถœ๋ ฅ๋˜๋Š” ํƒ€์ž…์— ๋Œ€ํ•ด ์—„๊ฒฉํ•˜๋‹ค. ์ฆ‰, ํ•˜์Šค์ผˆ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ํ•จ์ˆ˜๋Š” ์œ ์ผํ•œ principal type ์„ ๊ฐ€์ง€๋ฉฐ, ๊ทธ๊ฒƒ์ด ์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•œ์ง€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ฒดํฌ๋ฅผ ํ•˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ, ์—๋Ÿฌ๋ฅผ ๋ฑ‰๋Š”๋‹ค. ์ด๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ƒ๋‹นํ•œ ์ˆ˜์˜ ๋ฒ„๊ทธ๋ฅผ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„์‹œ ๊ทธ๊ฒƒ๋“ค์„ ์ฒดํฌํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„ ์„ฑ๋Šฅํ–ฅ์ƒ์—๋„ ์ด์ ์ด ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , ๋ณดํ†ต ์ด๋Ÿฐ ์ •์  ํƒ€์ž… ์–ธ์–ด๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ์ฝ”๋”ฉ์‹œ ๊ทธ๋Ÿฐ ํƒ€์ž…์„ ํ•˜๋‚˜ํ•˜๋‚˜ ์ ์–ด์ค˜์•ผ ํ•ด์„œ ๋ฒˆ๊ฑฐ๋กญ๊ธฐ ๋งˆ๋ จ์ด๋‹ค. ํ•˜์ง€๋งŒ, ํ•˜์Šค์ผˆ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด๋ฉด, ํŒŒ์ด์ฌ์ด๋‚˜ Perl ๊ฐ™์€ ๋™์  ํƒ€์ž… ์–ธ์–ด์ฒ˜๋Ÿผ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด๋†“์€ ๋ถ€๋ถ„์ด ๋ณ„๋กœ ์—†๋‹ค. ์‹ค์ œ๋กœ, ํ•˜์Šค์ผˆ์€ ๊ฐ•๋ ฅํ•œ Hindley-Milner ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ, ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š์•„๋„ ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉ๋œ ๋ฐ์ดํ„ฐ์™€ ์—ฐ์‚ฐ์ž ๋ฐ ๊ธฐํƒ€ ์ •๋ณด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์ž๋™์œผ๋กœ ์—ฐ์—ญํ•œ๋‹ค.[3] ๋ฌผ๋ก , ์˜ˆ์™ธ์ƒํ™ฉ์ด ์žˆ๊ธฐ๋•Œ๋ฌธ์—, ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ ์–ด์•ผ๋งŒ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์„ ๋‚ฎ์ถ”์–ด ์ตœ์ ํ™”ํ•˜๊ณ  ์‹ถ๊ฑฐ๋‚˜ ๊ด€์Šต์ ์œผ๋กœ ๋…ผ๋ฆฌ์  ๋ฒ„๊ทธ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด, ์ ์„ ํ•„์š”๊ฐ€ ์—†๋”๋ผ๋„ ์“ฐ๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

3.5. ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…[ํŽธ์ง‘]

๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…์€(Algebraic Data Type, ADT) ํ•˜์Šค์ผˆ์—์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. C์˜ struct, enum, union ๋“ฑ๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ํ›จ์”ฌ ์œ ์—ฐํ•œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋‹ค์Œ์˜ ์˜ˆ๋ฅผ ๋ณด์ž.


data Point = Point Int Int
data Bool = True | False
์œ„๋Š” ์ •์ˆ˜ ์ˆœ์„œ์Œ Point์™€ ๋ถˆ ํƒ€์ž… Bool[4]์„ ์ •์˜ํ•˜๋Š” ํ•˜์Šค์ผˆ ์ฝ”๋“œ์ด๋‹ค. Point์™€ Bool์€ ๊ฐ๊ฐ C์—์„œ struct์™€ enum์„ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋“ฑํ˜ธ ์™ผ์ชฝ์— ์˜ค๋Š”๊ฒƒ์€ ํƒ€์ž…์˜ ์ด๋ฆ„์ด๋ฉฐ, ๋“ฑํ˜ธ ์˜ค๋ฅธ์ชฝ์— ์˜ค๋Š”๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์ž์ด๋‹ค. ๋ฐ์ดํ„ฐ ์ƒ์„ฑ์ž๋Š” ํ•จ์ˆ˜์˜ ์ผ์ข…์ด๋ฉฐ, ํŒจํ„ด๋งค์นญ์„ ํ†ตํ•ด์„œ ๋ถ„ํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ„์˜ ์˜ˆ์—์„œ Pointํƒ€์ž…์€ Point :: Int -> Int -> Point ๋ผ๋Š” ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง€๋ฉฐ, Boolํƒ€์ž…์€ True :: Bool์™€ False :: Bool์˜ ๋‘๊ฐœ์˜ ์ƒ์„ฑ์ž๋ฅผ ๊ฐ€์ง„๋‹ค.

ํ•œํŽธ, ํ•˜์Šค์ผˆ์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ๋ฐ›๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

data Maybe a    = Nothing | Just a
data Either a b = Left a | Right b
data Pair a b   = Pair a b
data List a     = Nil | Cons a (List a)
Maybe๋Š” nullableํ•œ ๊ฐ’์„ ํ‘œํ˜„ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ, Swift๋“ฑ์˜ Optionalํƒ€์ž…๊ณผ ๊ฐ™๋‹ค. Either์™€ Pair๋Š” ๊ฐ๊ฐ sum type๊ณผ product type์ด๋ผ ๋ถˆ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ, Either๋Š” a, b์ค‘ ํ•œ๊ฐ€์ง€ ๊ฐ’๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์„ ํ‘œํ˜„ํ•˜๋ฉฐ, Pair๋Š” a, b์˜ ๊ฐ’์„ ๋™์‹œ์— ๊ฐ€์ง€๋Š” ํƒ€์ž…์„ ํ‘œํ˜„ํ•œ๋‹ค. List๋Š” lisp์˜ ๋ฆฌ์ŠคํŠธ ์ฒ˜๋Ÿผ ์žฌ๊ท€์ ์œผ๋กœ ์ •์˜๋˜๋Š” ๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค. Maybe, Either๋‚˜ List ํƒ€์ž…์€ C์˜ union๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ ๋˜์ง€๋งŒ, ํ•œ ๊ฐ’์„ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํƒ€์ž…์œผ๋กœ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์„ ๊ธˆ์ง€ํ•˜๋ฏ€๋กœ union์™€ ๋‹ฌ๋ฆฌ ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. Maybe๋“ฑ์€ ๊ทธ ์ž์ฒด๋กœ๋Š” ํƒ€์ž…์ด ์•„๋‹ˆ๋ฉฐ, Maybe Bool ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ ์šฉํ•ด ํƒ€์ž…์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ํƒ€์ž…์„ ์ธ์ž๋กœ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ๋งŒ๋“œ๋Š” ํƒ€์ž…์„ ํƒ€์ž… ์ƒ์„ฑ์ž๋ผ๊ณ  ๋ถ€๋ฅด๋ฉฐ ์ด๋Š” ํƒ€์ž… ๋ ˆ๋ฒจ ์—์„œ์˜ ํ•จ์ˆ˜๋กœ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ํƒ€์ž…๋“ค์„ ๊ตฌ๋ถ„์ง“๊ธฐ ์œ„ํ•ด์„œ ํ•˜์Šค์ผˆ์€ kind๋ผ๋Š” ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”๋ฐ, kind๋Š” ๊ฐ„๋‹จํžˆ ๋งํ•ด ํƒ€์ž…์˜ ํƒ€์ž…์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์œ„์—์„œ ์ •์˜ํ•œ ํƒ€์ž…๋“ค์€ Bool :: Type, Maybe :: Type -> Type, Either :: Type -> Type -> Type ๋“ฑ์˜ kind๋ฅผ ๊ฐ€์ง„๋‹ค.

์ด๊ฒƒ์ด ๋์ด ์•„๋‹ˆ๋ผ, ๋‹ค์Œ์ฒ˜๋Ÿผ ํƒ€์ž…์ƒ์„ฑ์ž๋ฅผ ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ ๋ฐ›๋Š” ํƒ€์ž…๋„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

data Apply f a = App (f a)
Apply :: (Type -> Type) -> Type -> Type

๋˜ํ•œ ghc ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋Ÿฌํ•œ ํƒ€์ž…์‹œ์Šคํ…œ์„ ๋”์šฑ ์œ ์—ฐํ•˜๊ฒŒ ํ™•์žฅํ•˜๋Š” GADT๋“ฑ์˜ compiler extension์„ ์ œ๊ณตํ•œ๋‹ค.

3.6. Parametric polymorphism[ํŽธ์ง‘]

OOP์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋‹คํ˜•์„ฑ์—๋Š” ad hoc polymorphism๊ณผ subtype polymorphism์ด ์žˆ๋‹ค. ad hoc polymorphism์€ ํ•จ์ˆ˜ ์˜ค๋ฒ„๋กœ๋”ฉ๊ณผ ๊ฐ™์ด ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๊ตฌํ˜„์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๋ฉฐ, subtype polymorphism์€ ํด๋ž˜์Šค์˜ ์ƒ์†๊ด€๊ณ„๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„๋˜๋Š” ๋‹คํ˜•์„ฑ์„ ๋งํ•œ๋‹ค. parametric polymorphism๊ณผ typeclass๋Š” ํ•˜์Šค์ผˆ์ด ์ž๋ž‘ํ•˜๋Š”(?) OOP ์Šคํƒ€์ผ ๋‹คํ˜•์„ฑ์˜ ๋Œ€ํ•ญ๋งˆ์ด๋‹ค.

parametric polymorphism์€ ๊ทธ ์ด๋ฆ„์ฒ˜๋Ÿผ, ๋‹คํ˜•์„ฑ์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ํƒ€์ž… ๋ณ€์ˆ˜๋ฅผ ์ž…๋ ฅ์œผ๋กœ ๋ฐ›์•„ ํ‰๋ฒ”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ถœ๋ ฅ์œผ๋กœ ๋‚ด๋†“๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ๋ณด๋Š”๊ฒƒ์ด๋‹ค.[5] ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด, ์œ ์ €๊ฐ€ ํƒ€์ž…์„ ์ง์ ‘ ์ •์˜ํ• ๋•Œ ํƒ€์ž…๋ณ€์ˆ˜ a ๊ฐ™์€๊ฒƒ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๊ฒƒ์„ ์ด์šฉํ•ด์„œ ํ•˜๋‚˜์˜ ํƒ€์ž…์„ ์–ธ์œผ๋กœ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํƒ€์ž…์— ๋งž๊ฒŒ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ์›์†Œ์Šค ๋ฉ€ํ‹ฐ์œ ์ฆˆ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด

const :: a โ†’ b โ†’ a
const x y = x
๋Š” ํƒ€์ž… ๋ณ€์ˆ˜ a, b๋ฅผ ๋ฐ›์•„์„œ x :: a์™€ y :: b๋ฅผ ๋ฐ›์•„ x๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ์ด ํ•จ์ˆ˜์˜ ํƒ€์ž…์„ ์กฐ๊ธˆ๋” ๋ช…์‹œ์ ์œผ๋กœ ์“ฐ๋ฉด const :: forall a b. a -> b -> a ์ธ๋ฐ, curry-howard correspondence์— ๋”ฐ๋ฅด๋ฉด universal quantifier โˆ€ ๋˜ํ•œ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์—ฌ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ parametric polymorphism์ด ํƒ€์ž…์„ ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์—ฌ๊ธด๋‹ค๋Š” ๋งฅ๋ฝ๊ณผ ์ผ์น˜ํ•œ๋‹ค. ํ•œํŽธ, ์‹ค์ œ๋กœ ํ•˜์Šค์ผˆ์—์„œ ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์ด ํƒ€์ž… ๋ณ€์ˆ˜๋“ค์ด ์ž๋™์œผ๋กœ ์ถ”๋ก ๋˜์–ด ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œํ•  ํ•„์š”๋Š” ์—†๋‹ค.[6]

๊ทธ๋Ÿฐ๋ฐ ํ•˜์Šค์ผˆ์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์–ด๋–ค ํ˜•ํƒœ๋กœ๋„ down casting์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ํ•˜์Šค์ผˆ์—์„œ f :: a -> a์˜ ๊ฐ€๋Šฅํ•œ ์œ ์ผํ•œ ๊ตฌํ˜„์€[7] f x = x, ์ฆ‰ idํ•จ์ˆ˜ ๋ฟ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ parametric polymorphism๋งŒ์„ ๊ฐ€์ง€๊ณ ๋Š” ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์—[8], ํ•˜์Šค์ผˆ์€ typeclass๋ฅผ ํ†ตํ•ด ad hoc polymorphism์„ ์ง€์›ํ•œ๋‹ค.

ํ•˜์Šค์ผˆ์ด down casting์„ ๊ธˆ์ง€ํ•˜๋Š” ๊ฒƒ์€ ์–ธ์–ด ๋””์ž์ธ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•˜์Šค์ผˆ์€ down casting์„ ๊ธˆ์ง€ํ•˜๋ฏ€๋กœ์„œ ad hoc polymorphism์„ typeclass์˜ ์ธ์Šคํ„ด์Šค ์ •์˜์— ๊ฐ€๋‘”๋‹ค. ์ฆ‰ typeclass์˜ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉด์„œ ๋‹คํ˜•์ ์œผ๋กœ ์ž‘์„ฑ๋œ ํ•จ์ˆ˜๋Š” ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ(uniformly) ์ž‘๋™ํ•˜๋ฉฐ, ์ด๋ฅผ parametricity๊ฐ€ ๋ณด์กด๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ•œ๋‹ค. parametricity๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ฒƒ์€ ๋˜ํ•œ ์ปดํŒŒ์ผ ์ดํ›„์— ํƒ€์ž… ์ •๋ณด๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์šฐ๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

typeclass๋Š” type๋“ค์˜ ์ง‘ํ•ฉ(์‚ฌ์‹ค class)์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค.[9] ์˜ˆ๋ฅผ ๋“ค์–ด, ์›์†Œ๊ฐ„ ๋Œ€์†Œ๋น„๊ต๊ฐ€ ๊ฐ€๋Šฅํ•œ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด ์ •์˜ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋Œ€์†Œ๋น„๊ต ํ•จ์ˆ˜ lessThan :: a -> a -> Bool์„ ๊ตฌํ˜„ํ•œ ํƒ€์ž…๋“ค Ord a ๋กœ ๋ฌถ๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Ord๋ฅผ ๊ตฌํ˜„ํ•œ ์ž„์˜์˜ ํƒ€์ž…๋“ค์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” ํ•จ์ˆ˜ sort :: Ord a => List a -> List a๋ฅผ lessThanํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. '=>' ๋ถ€๋ถ„์„ ๋…ผ๋ฆฌ์‹์—์„œ์˜ implication ์ฆ‰, if ~ then ~ ์œผ๋กœ ์ฝ๋Š”๋‹ค๋ฉด 'Ord a ์ด๋ฉด List a -> List a ์ด๋‹ค' ์ •๋„๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

OOP ๋ณด๋‹ค ์œ ์—ฐํ•œ ์‹œ์Šคํ…œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ฐฉ๋ฒ•๊ณผ ์ ‘๊ทผ๋ฐฉ์‹๋งŒ ์‚ด์ง ๋‹ค๋ฅผ ๋ฟ, OOP ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ OOP ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์— ๊ฐ€๊นŒ์šด ์ˆ˜์ค€์œผ๋กœ ๊ฐ„๋‹จํžˆ ์—๋ฎฌ๋ ˆ์ด์…˜ ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด,

class (Eq a) => Ord a where ...

๋Š” Ord a ๋ผ๋Š” ํƒ€์ž… ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋ฉด์„œ, ๋™์‹œ์— ์ด๊ฒƒ์€ Eq a์—ฌ์•ผ ํ•จ์„ ์ „์ œํ•˜๊ณ  ์žˆ๊ธฐ๋•Œ๋ฌธ์— Ord a๊ฐ€ Eq a์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ[10]์ž„์„ ๋งํ•˜๋Š”๊ฒƒ์ด๊ณ , ์ด๋Š” Ord a ํด๋ž˜์Šค์˜ ํƒ€์ž…๋“ค์€ Eq a ํด๋ž˜์Šค์˜ ๋ชจ๋“  ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฆ‰ OOP์—์„œ์˜ ์ƒ์†๊ณผ ์œ ์‚ฌํ•ด์ง„๋‹ค.

typeclass๋Š” OOP์—์„œ ๋ณด์ด๋Š” interface์™€ ์œ ์‚ฌํ•œ ๊ฐœ๋…์ด์ง€๋งŒ, ๋ช‡๊ฐ€์ง€ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ์ฐจ์ด์ ์€ ๋Œ€๋ถ€๋ถ„์˜ OOP์–ธ์–ด์—์„œ interface๊ฐ€ ํƒ€์ž… ์„ ์–ธ๊ณผ interface์˜ ๊ตฌํ˜„์„ ๋™์‹œ์— ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์— ๋น„ํ•ด, typeclass์˜ instance๋Š” ์ฝ”๋“œ์˜ ์•„๋ฌด ์œ„์น˜์—์„œ๋‚˜ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด๋‹ค. ์ด๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ •์˜๋œ typeclass์™€ ๋ฐ์ดํ„ฐ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“œ๋Š”๋“ฑ ํ›จ์”ฌ ์œ ์—ฐํ•œ ์‚ฌ์šฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค. ๋˜ํ•œ interface๊ฐ€ Type kind์— ๋Œ€ํ•œ interface๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ๋งŒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์— ๋น„ํ•ด, ํ•˜์Šค์ผˆ์˜ typeclass๋Š” ์ž„์˜์˜ kind์— ๋Œ€ํ•œ class๋ฅผ ์„ ์–ธํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ๋‹ค. ์•„๋žซ๋ฌธ๋‹จ์˜ Monad๋˜ํ•œ Type->Type kind์— ๋Œ€ํ•ด ์ •์˜๋œ typeclass์ด๋‹ค.

ํ•˜์Šค์ผˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ dynamic dispatch๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์ง€๋งŒ, existential type์ด๋ผ๋Š” compiler extension์„ ํ†ตํ•ด ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. existential type์€ ์›๋ž˜์˜ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์žƒ์œผ๋ฉด์„œ ํŠน์ • ํƒ€์ž…ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ์ •๋ณด๋งŒ์„ ์œ ์ง€ํ• ์€ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค . ์˜ˆ๋ฅผ๋“ค์–ด exist a. Show a => aํƒ€์ž…์€ ์ด ํƒ€์ž…์ด Show์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์ง„๋‹ค๋Š”๊ฒƒ์€ ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ํƒ€์ž…์ด ๋ณธ๋ž˜ ๋ฌด์Šจ ํƒ€์ž…์ธ์ง€๋Š” ์•Œ์ˆ˜ ์—†์œผ๋ฉฐ ํŒจํ„ด๋งค์นญ ๋˜ํ•œ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. OOP์™€ ๋น„๊ตํ•˜์ž๋ฉด up casting์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ down casting์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ์…ˆ์ด๋‹ค. ๋”ฐ๋ผ์„œ existential type์€ parametricity๋ฅผ ํ•ด์น˜์ง€ ์•Š๋Š”๋‹ค.

3.7. ๋ชจ๋‚˜๋“œ[ํŽธ์ง‘]

>>=[11]
๋ชจ๋‚˜๋“œ๋Š” ๊ทธ๋ƒฅ ์ž๊ธฐ ํ•จ์ž ๋ฒ”์ฃผ์˜ ๋ชจ๋…ธ์ด๋“œ์ผ ๋ฟ์ธ๋ฐ, ๋Œ€์ฒด ๋ญ๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๊ฑฐ์•ผ?
- 1990, ํ•„๋ฆฝ ์™€๋“ค๋Ÿฌ (ํ•˜์Šค์ผˆ ์„ค๊ณ„ ์ฑ…์ž„์ž) [12]

์ง€๊ธˆ๊นŒ์ง€ ์ข‹์€ ์ ๋งŒ ๋‚˜์—ดํ–ˆ๋Š”๋ฐ, ๊ทธ๋Ÿผ์—๋„ ํ•˜์Šค์ผˆ ์ ์œ ์œจ์ด ๋ฐ”๋‹ฅ์„ ์น˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๊ณ , ๊ทธ ์ด์œ ๋Š” ๋ฌผ๋ก  ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€๋งŒ, ์ง€๊ธˆ ์ด ํ•ญ๋ชฉ์—์„œ ์ด์•ผ๊ธฐํ•˜๋Š” ๋ชจ๋‚˜๋“œ๊ฐ€ ์ปค๋‹ค๋ž€ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ๋‹ค. ๋ชจ๋‚˜๋“œ๋Š” ์ˆ˜ํ•™์˜ ๋ฒ”์ฃผ๋ก (Category theory)์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์‚ฌ์‹ค ํ•˜์Šค์ผˆ์„ ๋ฐฐ์šฐ๋˜ ์‚ฌ๋žŒ ์ค‘ ์ƒ๋‹น์ˆ˜๊ฐ€ ๋ชจ๋‚˜๋“œ๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ์ดํ•ดํ•˜๋ ค๋‹ค ๋ฉ˜๋ถ• ํ›„ ์ ‘๋Š”๋‹ค๊ณ  ๋ด๋„ ๋  ์ •๋„๋กœ ๊ฐœ๋…์  ์ดํ•ด๊นŒ์ง€์˜ ๋‚œ์ด๋„๊ฐ€ ๋†’๋‹ค. ํ•˜์ง€๋งŒ, ์• ์‹œ๋‹น์ดˆ ์ˆ˜ํ•™์˜ ๋ชจ๋‚˜๋“œ์™€๋Š” ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๋‹ค๋ฅธ๋ฐ๋‹ค ์‹ค์ œ ์‚ฌ์šฉ๋ก€ ์œ„์ฃผ๋กœ๋งŒ ์Šต๋“ํ•ด์„œ๋งŒ ์จ๋„ ๋ณ„ ๋ฌธ์ œ ์—†์œผ๋ฉฐ ์‰ฝ๊ฒŒ ์“ฐ๋ผ๊ณ  do ๊ฐ™์€ ๋ฌธ๋ฒ•๋„ ์ง€์›ํ•ด์ฃผ๋ฏ€๋กœ ์ˆ˜ํ•™์ ์ธ ๊ฐœ๋…์ด ์ดํ•ด๊ฐ€ ์•ˆ ๊ฐ„๋‹ค๊ณ  ๊ทธ๋‹ค์ง€ ๋‚œ๊ฐํ•ด ํ•  ๊ฒƒ์€ ์—†๋‹ค.

๋ง‰์—ฐํžˆ ์–ด๋ ต๋‹ค ํ•˜๋ฉด ๋Œ€์ค‘์ ์ธ ๊ด€์ ์—์„œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ์ตœ๋Œ€ ๋‚œ์ ์œผ๋กœ ๋ถˆ๋ฆฌ์šฐ๋Š” C ์–ธ์–ด์˜ ํฌ์ธํ„ฐ๊ฐ™์€ ๊ฒƒ์ธ๊ฐ€ ์ƒ๊ฐ์ด ๋“คํ…๋ฐ, ์งง์€ ์ง€๋ฌธ์—์„œ ๋ชจ๋‚˜๋“œ์˜ ์ •ํ™•ํ•œ ๊ฐœ๋…์  ์„ค๋ช…์€ ๋ฌด๋ฆฌ๊ณ , ์—ฌ๊ธฐ์„œ๋Š” ๋Œ€์ถฉ '๋ฌด์—‡์ด ์–ด๋ ค์šด์ง€' ๊ฐ์„ ์žก๊ธฐ ์œ„ํ•ด ๋ฒ”์ฃผ๋ก ์—์„œ ๋ชจ๋‚˜๋“œ๋ž€ ๊ฒŒ ๋ฌด์—‡์ธ์ง€ ๊ฐœ๋…์„ ํ›‘์–ด๋ณด๋„๋ก ํ•œ๋‹ค.

๋ฒ”์ฃผ(Category)๋Š” ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ๋Œ€์ƒ(Object)๊ณผ ๊ทธ ๋Œ€์ƒ ์‚ฌ์ด์˜ ์‚ฌ์ƒ(Morphism)[13]์œผ๋กœ ์ •์˜๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ € ๊ทœ์น™์ด๋ž€ ๊ฒƒ์ด ๊ฒฐํ•ฉ๋ฒ•์น™ ์„ฑ๋ฆฝ, ํ•ญ๋“ฑ์‚ฌ์ƒ[14]์˜ ์กด์žฌ 2๊ฐœ๋ฐ–์— ์—†๋‹ค. ์ด๋ ‡๊ฒŒ ๊ทœ์น™์ด ์•„์ฃผ ์ผ๋ฐ˜์ ์ด์–ด์„œ ์‚ฌ์‹ค ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ๋“ค์ด ์ € ๊ทœ์น™์— ํ•ด๋‹น๋œ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋„ ์˜ˆ์™ธ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋Œ€์ƒ์œผ๋กœ ๋†“๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ ํƒ€์ž… ์‚ฌ์ด์˜ ํ•จ์ˆ˜(ํ”„๋กœ๊ทธ๋žจ)๋“ค์„ ์‚ฌ์ƒ์œผ๋กœ ๋†“์œผ๋ฉด ์ด๊ฒƒ๋„ ํ•˜๋‚˜์˜ ํ›Œ๋ฅญํ•œ ๋ฒ”์ฃผ๊ฐ€ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ, ๋‹ค์‹œ ๋‘๊ฐœ์˜ ๋ฒ”์ฃผ ์‚ฌ์ด์˜ ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ฒ”์ฃผ๋ก ์—์„œ๋Š” ๋ช‡๊ฐ€์ง€ ๊ทœ์น™์„ ๋งŒ์กฑ์‹œํ‚ค๋Š” ์ €๋Ÿฐ ๊ตฌ์กฐ๋ฅผ ํ•จ์ž(Functor)๋ผ ํ•œ๋‹ค[15]. ์ด ๊ทœ์น™ ์—ญ์‹œ ์•„์ฃผ ๊ด€๋Œ€ํ•ด์„œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋“ค์—์„œ ์Šคํƒ ๋‹ค๋“œ๋กœ ์‚ฌ์šฉ๋˜๋Š” map ๊ฐ™์ด ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ์ธํ’‹์œผ๋กœ ๋ฐ›๋Š” ๊ณ ์ฐจํ•จ์ˆ˜(higher-order function) ๋ช‡๋ช‡์ด ์ด์— ํ•ด๋‹น๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ, ๋‹ค์‹œ ๋‘๊ฐœ์˜ ํ•จ์ž ์‚ฌ์ด์˜ ๋ณ€ํ™˜์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋Š”๋ฐ, ๋ฒ”์ฃผ๋ก ์—์„œ๋Š” ๋ช‡๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์ €๋Ÿฐ ๋ณ€ํ™˜์„ ์ž์—ฐ ๋ณ€ํ™˜(Natural transformation)์ด๋ผ ํ•œ๋‹ค. ์ด ์กฐ๊ฑด ์—ญ์‹œ ์ƒ๋‹นํžˆ ๊ด€๋Œ€ํ•œ๋ฐ unit ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์ด๋Ÿฐ ์กฐ๊ฑด์„ ๋งŒ์กฑ์‹œํ‚จ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค์‹œ ์ € ์ž์—ฐ ๋ณ€ํ™˜์ด ๊ด€๋ จ๋œ ๋ช‡๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํ•จ์ž ์Œ์„ ์ˆ˜๋ฐ˜ํ•จ์ž(Adjoint functor)๋ผ ํ•˜๋Š”๋ฐ, ๋ชจ๋‚˜๋“œ(Monad)๋Š” ๋ฐ”๋กœ ์ด ์ˆ˜๋ฐ˜ํ•จ์ž์Œ์˜ Composition ์ด๋‹ค. ์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋ฉด ๋ญ”์†Œ๋ฆฐ์ง€๋Š” ๋ชฐ๋ผ๋„ ๋ญ๊ฐ€ ์–ด๋ ค์šด๊ฑด์ง€ ๋Œ€์ถฉ ์ดํ•ด๋Š” ๊ฐˆ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ƒฅ ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜์˜ ํ•จ์ˆ˜์˜... ์‹์œผ๋กœ order ๊ฐ€ ์˜ฌ๋ผ๊ฐ€๊ณ , order ๊ฐ€ ์˜ฌ๋ผ๊ฐˆ ๋•Œ๋งˆ๋‹ค ์กฐ๊ฑด์ด ๋ถ™๊ณ ...์ตœ์ข…์ ์œผ๋กœ ๊ทธ๋ž˜์„œ ๊ทธ๊ฒŒ ๋Œ€์ฒด ๋ฌด์—‡์ธ๊ฐ€ ์˜ค๋ฆฌ๋ฌด์ค‘์— ๋น ์ง€๋Š” ๋‚œ์ ์ด ์žˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋‚˜๋“œ๋ฅผ ์ƒ๋‹นํžˆ ์–ด๋ ต๊ฒŒ ์„ค๋ช…ํ•œ ๊ฒƒ์ด๋ฏ€๋กœ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ํ›จ์”ฌ ๋” ์‰ฝ๊ฒŒ ์ถ”์ƒํ™”ํ•˜์—ฌ ์„ค๋ช…์ด ๊ฐ€๋Šฅํ•˜๋‹ˆ ์ฐพ์•„๋ณด๊ธฐ ๋ฐ”๋žŒ

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

์‹ค์šฉ์ ์ธ ๊ด€์ ์—์„œ ๋ชจ๋‚˜๋“œ์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์šฉ๋„๋Š” Side-Effect๊ฐ€ ์žˆ๋Š” Impure Function์„ Pure Function์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋‹ค๋ฃจ๋Š” ๊ฒƒ์ด๋‹ค. ๋Œ€๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•˜์ž๋ฉด, Side-Effect๋Š” ๋ณดํ†ต ์™ธ๋ถ€ ์ƒํƒœ(์ดํ•˜ State)๊ฐ€ ์žˆ๊ณ  ์ด๊ฒƒ์— ์ ‘๊ทผํ•˜์—ฌ ์ƒ๊ธด๋‹ค. ๋ฐ˜๋Œ€๋กœ Side-Effect๊ฐ€ ์—†๋Š” Pure Function์€ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜์–ด ์™ธ๋ถ€ ์ƒํƒœ์— ์ ‘๊ทผํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ค ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ State๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•œ ๊ฒฐ๊ณผ๋กœ State๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค๋ฉด ์™ธ๋ถ€ ์ƒํƒœ์— ์ ‘๊ทผ์„ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฉฐ pure function์ด ๋œ๋‹ค. ์ด ๋•Œ State ์™ธ์—๋„ ๊ฒฐ๊ณผ๊ฐ’ a๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ฆ‰, ์ž…๋ ฅ์ด State๋ฉด ์ถœ๋ ฅ์ด (a, State)๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.(์ด๊ฒƒ์„ Stateโ†’(a, State)๋ผ๊ณ  ๋‚˜ํƒ€๋‚ธ๋‹ค.) ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ๋‹ค์–‘ํ•˜๊ฒŒ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’๋„ a ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํ•˜์Šค์ผˆ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋ฅผ ํ•ฉ์„ฑํ•˜๋Š” ๋ฐฉ์‹(f ์™€ g๋ฅผ ํ•ฉ์„ฑํ•˜๋ฉด g(f(x))๊ฐ€ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ)์œผ๋กœ ์ž‘์„ฑ์„ ํ•ด์•ผํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ f๊ฐ€ Stateโ†’(a, State), g๊ฐ€ Stateโ†’(b, State)๋ผ๋ฉด f์˜ ์ถœ๋ ฅ๊ณผ g์˜ ์ž…๋ ฅ ํƒ€์ž…์ด ๋งž์ง€ ์•Š๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ f์˜ ๊ฒฐ๊ณผ๊ฐ’์ธ (a, State)๋ฅผ a์™€ State๋กœ ๋ถ„๋ฆฌํ•ด์„œ a๋Š” g์™€ ๊ฒฐํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ g'๋ฅผ ๋งŒ๋“ค๊ณ  State๋ฅผ ์ด ์ƒˆ๋กœ์šด ํ•จ์ˆ˜ g'์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฒฐํ•ฉ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด bind(Haskell์—์„œ >>=์—ฐ์‚ฐ์ž)๋ผ๊ณ  ํ•˜๊ณ  ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒƒ์„ monad๋ผ๊ณ  ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ๋์ด ์•„๋‹ˆ๋ผ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜๋ฅผ ๋” ์ž‡๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์ด์œผ๋ฉด ๊ฑฐ๋Œ€ํ•œ ํ•˜๋‚˜์˜ Pure Function์ด ๋œ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์œ„์˜ ๊ฒฝ์šฐ f์™€ g๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ž…๋ ฅ์ด State, ์ถœ๋ ฅ์ด (b, State)์ธ ํ•จ์ˆ˜๊ฐ€ ๋œ๋‹ค.)

์ด๊ฒƒ์„ ์กฐ๊ธˆ ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋ณด์ž๋ฉด ์–ด๋–ค ์™ธ๋ถ€ ์ƒํƒœ State์— ๋Œ€ํ•ด f, g๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์ˆ˜ํ•œ ํ•จ์ˆ˜๊ฐ€ ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋‹ค๋ฅด๊ฒŒ ๋งํ•˜์ž๋ฉด ๋ช…๋ นํ˜• ์–ธ์–ด์ฒ˜๋Ÿผ ์ˆœ์ฐจ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‹ค๋ณด๋‹ˆ ํ•˜์Šค์ผˆ์—์„œ๋Š” ๋ชจ๋‚˜๋“œ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ๋‹ค.

์ฆ‰, ํ•˜์Šค์ผˆ์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์ด๋ฉด์„œ ๋™์‹œ์— ๋ชจ๋‚˜๋“œ๋ฅผ ์ด์šฉํ•ด ์ •์˜๋˜๋Š” ๋ช…๋ นํ˜• ์–ธ์–ด๋ผ๋Š” ์„œ๋ธŒ์–ธ์–ด๋ฅผ ๋‚ด๋ถ€์— ๊ฐ–๊ณ ์žˆ๋Š”์…ˆ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋ฐ˜๋Œ€๋กœ, C++ ์ด๋‚˜ ํŒŒ์ด์ฌ๊ฐ™์ด ๋ช…๋ นํ˜• ์–ธ์–ด์ด๋ฉด์„œ ํ•จ์ˆ˜ํ˜• ํ‘œํ˜„์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์™€ ๋‹ค๋ฅธ ๊ฒƒ์€ ๋ฌด์—‡์ธ๊ฐ€...์ƒ๊ฐ์ด ๋“ค๋ฒ•๋„ ํ•œ๋ฐ, ๋ชจ๋‚˜๋“œ๋ฅผ ์ด์šฉํ•ด ํ•˜์Šค์ผˆ ๋‚ด๋ถ€์— ์ •์˜๋˜๋Š” ๋ช…๋ นํ˜• ์–ธ์–ด ์‹œ์Šคํ…œ์€ ์ˆœ์ˆ˜์„ฑ(Purity)๋ฅผ ํ›ผ์†ํ•˜์ง€ ์•Š์•„ ์ฐธ์กฐ ํˆฌ๋ช…์„ฑ(Referential transparency)๊ฐ€ ์œ ์ง€๋˜๋ฉฐ ๋™์‹œ์— ๋ช…๋ นํ˜• ์–ธ์–ด ๋ถ€๋ถ„๊ณผ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ๋ถ€๋ถ„์ด ์—„๊ฒฉํ•˜๊ฒŒ ๊ตฌ๋ถ„๋œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ, ๋ช…๋ นํ˜• ์–ธ์–ด ๋ฒ ์ด์Šค์— ํ•จ์ˆ˜ํ˜• ํ‘œํ˜„์„ ์ถ”๊ฐ€ํ•œ ์–ธ์–ด๋“ค์€ ๋ง๊ทธ๋Œ€๋กœ ์ €๋Ÿฐ 'ํ‘œํ˜„'์ •๋„๋ฅผ ์ง€์›ํ•˜๋Š” ์ •๋„๋ผ, ์ €๋Ÿฐ ๊ตฌ๋ถ„์ด ์กด์žฌํ•˜์ง€ ์•Š๊ณ  ์„ž์ด๋Š” ๊ฒฝํ–ฅ์ด ์žˆ๋‹ค.

์‚ฌ์‹ค ๋ชจ๋‚˜๋“œ๋Š” ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์„ ์ˆ˜์šฉํ•˜๋Š” ์–ธ์–ด๋ผ๋ฉด ๋ชจ๋‘ ์ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์Šค์ผˆ์—์„œ๋„ ๋ชจ๋‚˜๋“œ๋Š” ์–ธ์–ด ๋ ˆ๋ฒจ์—์„œ ๊ตฌํ˜„ํ•œ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ, ์ˆ˜๋งŽ์€ ํƒ€์ž… ํด๋ž˜์Šค ๊ตฌํ˜„ ์ค‘ ํ‰๋ฒ”ํ•˜๊ณ (?) ์กฐ๊ทธ๋งˆํ•œ(!) ํ•˜๋‚˜์ด๋‹ค.[16] ๋‹ค๋งŒ ํ•˜์Šค์ผˆ์—์„œ๋Š” ์ด๋ฅผ ๋ณด๋‹ค ์ ๊ทน์ ์œผ๋กœ ์–ธ์–ด์˜ ํŠน์ง•์œผ๋กœ ๋‚ด์„ธ์›Œ์„œ ์ ์šฉํ•˜๊ณ  ์žˆ์„ ๋ฟ์ด๋‹ค. ๊ทธ ๋•์— ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๋ฉ˜๋ถ•์„ ํ•˜๊ณ  ์žˆ๊ธฐ๋Š” ํ•˜์ง€๋งŒ... ์—ฌ๋‹ด์œผ๋กœ ๋ชจ๋‚˜๋“œ๋ฅผ ์‹ค์šฉ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ถ„์•ผ๊ฐ€ ๋ฐ”๋กœ JavaScript๋กœ ์ž‘์„ฑ๋œ ์—ฌ๋Ÿฌ ํ”„๋ ˆ์ž„์›์ด๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ค‘์—์„œ Ajax๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ํŠนํžˆ Promise์™€ ES7์— ์ถ”๊ฐ€๋œ async/await ๋ฌธ๋ฒ•์€ ํ•˜์Šค์ผˆ์˜ ๋ชจ๋‚˜๋“œ์™€ do์ด๋‹ค.[17] ์—ฌ๊ธฐ์— ๋ชจ๋‚˜๋“œ๋ฅผ ์ ๊ทน ์ ์šฉํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹Œ, ์ด๊ฒƒ์„ ์ ์šฉํ•˜๋ฉด ๋…ธ๊ฐ€๋‹ค ์–‘์ด ์ค„๊ณ , ์‚ฌ์šฉํ•˜๊ธฐ ํŽธํ•˜๋ฉฐ, ๋ณด๊ธฐ๋„ ์ข‹๊ธฐ ๋•Œ๋ฌธ.

4. ์ˆ˜ํ•™๊ณผ์˜ ๊ด€๋ จ์„ฑ[ํŽธ์ง‘]

์œ„์˜ ๋‚ด์šฉ์„ ์ฝ์–ด ๋ณด์•˜๋‹ค๋ฉด ์•Œ๊ฒ ์ง€๋งŒ ๊ฐ์ข… ์ˆ˜ํ•™ ์ด๋ก ์„ ์ด์šฉํ•ด์„œ ์–ธ์–ด๋ฅผ ๋งŒ๋“ค์–ด ๋ณด์ž๋Š” ์˜๋„๋กœ ๋งŒ๋“ค์–ด์ง„ ์–ธ์–ด์ด๋ฏ€๋กœ ์ˆ˜ํ•™๊ณผ์˜ ๊ด€๋ จ์„ฑ์€ ์–ด๋А ์ •๋„ ์žˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ํ•˜์Šค์ผˆ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ์ €์˜ ์ˆ˜ํ•™์„ ์ž˜ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์‹ค์ œ๋กœ๋„ ๋งŽ์€ ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ํ•˜์Šค์ผˆ์˜ ๋ฐ”ํƒ•์ด ๋˜๋Š” ์ˆ˜ํ•™ ๋ฐ ๋…ผ๋ฆฌ๋ฅผ ๋”ฐ๋กœ ๋ฐฐ์šฐ์ง€ ์•Š๊ณ ๋„ ๋Šฅํžˆ ๊ฐœ๋ฐœ์„ ํ•˜๊ณ  ์žˆ๋‹ค. ์•Œ๋ฉด ๋„์›€๋˜์ง€๋งŒ, ๋ชจ๋ฅธ๋‹ค๊ณ  ํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.[18]

ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ˆ˜ํ•™, ํŠนํžˆ ์ˆ˜๋ฆฌ๋…ผ๋ฆฌ์—์„œ ๋ฐฐ์šด์‚ฌ๋žŒ์€ ๋ณดํ†ต ฮป-calculus ํ˜น์€ class of recursive functions ๋ผ๋Š” ํ•จ์ˆ˜์ฒด๊ณ„๋ฅผ ํ†ตํ•ด ๋ฐฐ์šด๋‹ค. ๋‹น์—ฐํžˆ ์ด ์‹œ์Šคํ…œ๋„ ์‚ฌ์ด๋“œ์ดํŽ™ํŠธ๋Š” ์ „ํ˜€ ์—†์œผ๋ฉฐ[19] ์‹ฌ์ง€์–ด built-in ์กฐ๊ฑด๋ฌธ์ด๋‚˜ ๋ฃจํ”„๋ฌธ๋„ ์—†๋‹ค. ํ•˜์ง€๋งŒ ์ˆ˜ํ•™๋‹ต๊ฒŒ(?) ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŠธ๋ฆญ์œผ๋กœ ์กด์žฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ๋“ฌ์€ ๋ชจ๋‘ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ•˜์Šค์ผˆ์—๋„ ฮป-calculus๊ฐ€ ์–ด๋А ์ •๋„ ๋ฐ˜์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•„์˜ˆ ฮป์‹์ด๋ผ๋Š” ๊ฐœ๋…๋„ ์žˆ๋‹ค.[20] ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ํ•˜๋ฉด ์žฌ๊ท€๋ถ€ํ„ฐ ๋– ์˜ฌ๋ฆฌ๊ฒŒ ๋งˆ๋ จ์ด๊ณ , ์žฌ๊ท€์—๋งŒ ์–ด๋А์ •๋„ ์ต์ˆ™ํ•ด์ง€๋ฉด ๋ฌธ์ œ๊ฐ€ ์—†์„๊ฒƒ๊ฐ™์€ ์ƒ์ƒ์„ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€๋ฐ, ์žฌ๊ท€๋ณด๋‹ค ๋งˆ์Šคํ„ฐํ•˜๊ธฐ ์–ด๋ ค์šด๊ฒƒ์ด ฮป-calculus ์˜ ฮท-reduction ๊ณผ partial application ์„ ์ด์šฉํ•œ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ํŠธ๋ฆญ๋“ค์ด๋‹ค. ๋ณดํ†ต ํ•จ์ˆ˜๋ฅผ "์ •์˜"ํ• ๋•Œ x y ๋“ฑ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ(parameter)๋ฅผ ๋ช…์‹œํ•˜๋Š”๋ฐ, ฮท-reduction ๊ณผ partial application์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŽ์€ ๊ฒฝ์šฐ ์ €๋Ÿฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ๊ธฐํ˜ธ๋งŒ ๊ฐ–๊ณ  ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š”๊ฒŒ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค(point-free). ๋˜ํ•œ, (์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์— ํ•œํ•ด์„œ) ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ด๋ฉฐ ์ฝ”๋“œ ๊ธธ์ด๋„ ๊ดด์ƒํ•  ์ •๋„๋กœ ์ถ•์•ฝ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์œ ์šฉ์„ฑ๋„ ๊ฝค ๋˜๋Š”ํŽธ์ด์ง€๋งŒ, ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋ˆˆ์—๋Š” ๊ฑฐ์˜ ์•”ํ˜ธ๋ฌธ์ด ๋˜์–ด๋ฒ„๋ฆฌ๋ฏ€๋กœ, ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ œ๋Œ€๋กœ ์•Œ์•„๋‘๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํ•˜์Šค์ผˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ์€ inductive structure[21] ๋ฅผ ๊ฐ–์œผ๋ฏ€๋กœ, ์ˆ˜ํ•™์—์„œ ์‚ฌ์šฉ๋˜๋Š” type theory ์™€ ๋ณด๋‹ค ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์Šค์ผˆ์˜ ๋ํŒ์™•์ด๋ผ ๋ถˆ๋ฆฌ๋Š” monad ์—ญ์‹œ ์ˆ˜ํ•™์˜ category theory ์—์„œ ๊ฐ€์ ธ์™”์œผ๋ฉฐ, Co- ๋กœ ์‹œ์ž‘๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๊ฐœ๋…๋“ค๋„ ์—ญ์‹œ ์ˆ˜ํ•™์—์„œ ์“ฐ์ด๋Š”๊ฒƒ๋“ค์ด๋‹ค.[22] ๊ทธ๋ฆฌ๊ณ , ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•จ์ˆ˜ํ˜• ๊ตฌ์กฐ ์ž์ฒด๊ฐ€ ์œ„์— ์–ธ๊ธ‰ํ•œ ์ˆ˜ํ•™์—์„œ ์•Œ๊ณ ๋ฆฌ๋“ฌ์„ ํ‘œํ˜„ํ• ๋•Œ ์ž์ฃผ ์“ฐ์ธ๋‹ค. ๋•๋ถ„์— ์ˆ˜ํ•™(์ˆ˜๋ฆฌ๋…ผ๋ฆฌ)์™€ ์นœ๊ทผํ•˜๋‹ค๋ฉด ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๊ฐ€ ๊ฒฐ์ฝ” ๋‚ฏ์„ค์ง€ ์•Š์„๊ฒƒ์ด๋‚˜, ๋ชจ๋ฅธ๋‹ค๋ฉด ์ต์ˆ™ํ•ด์ง€๊ธฐ๊นŒ์ง€ ์ง„์ž…์žฅ๋ฒฝ๋„ ์€๊ทผํžˆ ๋†’์€ํŽธ์ด๊ณ  ์–ธ์–ด๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ธฐ๋„ ์ƒ๋‹นํžˆ ํž˜๋“ค์–ด์ง„๋‹ค. ๋‹ค๋งŒ, ์–ธ์–ด ์ž์ฒด์— ๋Œ€ํ•œ ๊นŠ์€ ์ดํ•ด๊ฐ€ ์—†๋”๋ผ๋„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๊ธฐ์— ํฐ ๋ฌด๋ฆฌ๋Š” ์—†์œผ๋ฏ€๋กœ ๋ถ€๋‹ด์„ ๊ฐ–์ง€๋Š” ๋ง์ž. ์• ์ดˆ์— C++๋‚˜ Java ๊ฐ™์€ ๊ณณ์— ์‚ฌ์šฉ๋˜๋Š” ์ปจ์…‰๋“ค๋„ ์ด๋ก ์ ์œผ๋กœ ๊นŠ๊ฒŒ ๋“ค์–ด๊ฐ€๋ฉด ์ˆ˜ํ•™ ์ด์ƒ์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋ณต์žกํ•˜๋‹ค. ํ•˜์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๋ ค๋Š” ๋ชฉ์ ์œผ๋กœ ๊ทธ๋Ÿฐ ์ด๋ก ๋“ค์„ ์ž˜ ์•Œ์ง€ ๋ชปํ•˜๊ณ  ๊ฐœ๋ฐœ์„ ํ•œ๋‹ค๊ณ  ํ•ด๋„ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์—†๋Š”๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋ฌผ๋ก , ์—ฌ๊ธฐ์—๋Š” ๊ฐ ์–ธ์–ด ์ œ์ž‘์ž๋“ค์ด ์ตœ๋Œ€ํ•œ ๊ด€๋ จ์ง€์‹ ์—†์ด ์ง๊ด€์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๋””์ž์ธ์„ ํ•˜๋Š”๊ฒƒ๋„ ํ•œ ๋ชซ ํ•œ๋‹ค. ํ•˜์Šค์ผˆ ์—ญ์‹œ ์ €๋Ÿฐ ์ด๋ก ์ ์ธ ๋‚ด์šฉ์ด ์•„๋‹ˆ๋ผ, ํ•จ์ˆ˜ํ˜• ํ‘œํ˜„์ด๋‚˜ ์žฌ๊ท€ ๋“ฑ์— ์ต์ˆ™ํ•ด์ง€๋Š” ๊ฒƒ์ด ๊ด€๊ฑด์ด๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, ์ปดํ“จํ„ฐ์˜ ํƒ„์ƒ์—๋Š” 20์„ธ๊ธฐ ์ดˆ๋ฐ˜์˜ ์ˆ˜๋ฆฌ๋…ผ๋ฆฌํ•™์˜ ๊ฐœ๋…๋“ค์ด ์˜ํ–ฅ์„ ์ฃผ์—ˆ๋Š”๋ฐ, ํ•˜์Šค์ผˆ์€ ๋” ๋‚˜์•„๊ฐ€์„œ 20์„ธ๊ธฐ ํ›„๋ฐ˜ ์ดํ›„์˜ ์ˆ˜ํ•™ ๋ฐ ์ˆ˜๋ฆฌ๋…ผ๋ฆฌํ•™์˜ ๊ฐœ๋…๋“ค๊นŒ์ง€ ์ด์šฉํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. [23]

5. ์•ˆ ์จ์š”[ํŽธ์ง‘]


Haskell ํŒฌ๋“ค์—๊ฒŒ Java๋Š” ๋ฉ์น˜๋งŒ ํฌ๊ณ  ๋ฌด๋„ˆ์ง€๊ธฐ ์‰ฝ๊ณ , C๋Š” ์‹œํ•œํญํƒ„ ๊ฐ™๊ณ , PHP๋Š” ์‚ฌ๊ณ ๊ฐ€ ํ„ฐ์ง€๋ฉด ๋Œ€ํ˜•์ฐธ์‚ฌ๊ธ‰(...)์ด๋ผ๊ณ  ์ธ์‹๋œ๋‹ค๋Š” ๊ฒƒ. ๋ฐ˜๋ฉด์— Haskell์€ ์ „์ฒด์ ์œผ๋กœ ์ธ์‹์ด ์ฒœ์žฌ ์•„์ธ์Šˆํƒ€์ธ. LISP๋Š” ๋ญ...

Avoid success at all costs.[24]
- Simon Peyton Jones[25]

์ธ๊ธฐ๋Š” ๋‘๋งํ•  ๊ฒƒ๋„ ์—†์ด ๋ฐ”๋‹ฅ์ด๋‹ค. ํ‘œํ˜„๋ ฅ์ด ์ข‹๊ณ , ์ฝ”๋“œ๊ฐ€ ๊ฐ„๊ฒฐํ•˜๋ฉฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„์ด ์ง๊ด€์ ์ด๊ณ , ๋ถ€์ˆ˜ํšจ๊ณผ๊ฐ€ ์—†๊ณ , ๋™์‹œ์„ฑ์ด ๋ณด์žฅ๋˜๋Š” ๊ฑด ์ข‹์€๋ฐ ์• ์ดˆ์— ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ผ๋Š” ๊ฒŒ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์™€ ์ฒด๊ณ„๊ฐ€ ๋„ˆ๋ฌด๋‚˜ ๋‹ฌ๋ผ์„œ ์‰ฝ๊ฒŒ ์ต์ˆ™ํ•ด์ง€๊ธฐ๋„ ์–ด๋ ต๊ณ  ํ˜„์‹ค์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์šด ์ ์ด ๋งŽ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ๋กœ ์‹œ๋„ํ•˜๋Š” ์‚ฌ๋žŒ ์ž์ฒด๊ฐ€ ์ ์–ด์„œ ์ž˜ ์•„๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์ง€ ์•Š์œผ๋‹ˆ ์‚ฌ์šฉ ์˜ˆ๊ฐ€ ์ ๊ณ , ์‚ฌ์šฉ ์˜ˆ๊ฐ€ ์ ์œผ๋‹ˆ ๋ฐฐ์šฐ๋ ค๋Š” ์‚ฌ๋žŒ์ด ์ ๋‹ค...์˜ ๋ฌดํ•œ ๋ฐ˜๋ณต. ๋‹น์žฅ ๊ฐœ์ค‘์— ์‰ฌ์šดํŽธ์— ์†ํ•˜๋Š” ์œ„์˜ ๋ฌดํ•œ ์ œ๊ณฑ ๋ฆฌ์ŠคํŠธ ์ฝ”๋“œ๋„ LISP๋‚˜ Erlang์„ ๊ณต๋ถ€ํ•œ ์‚ฌ๋žŒ์ด ์•„๋‹Œ ์ด์ƒ ๋ณ„๋‹ค๋ฅธ ํ•™์Šต ์—†์ด ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค. ๊ทธ๋‚˜๋งˆ LISP๊ฐ€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ์ค‘์—์„œ ๋น„์ค‘์ด ํฌ๋‹ค ๋ณด๋‹ˆ ์ƒ๋‹นํžˆ ๋ฐ€๋ฆฌ๊ณ , ์‚ฐ์—…๊ณ„์—์„œ๋Š” Java์™€ ํ˜ธํ™˜๋˜๋ฉฐ OOP๋„ ์ง€์›ํ•˜๋Š” Scala๊ฐ€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋กœ์„œ ํ›จ์”ฌ ์ธ๊ธฐ๋ฅผ ๋Œ๊ณ  ์žˆ๋‹ค.

์˜ค๋ž˜๋œ(?) ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฉ์–ธ์ค‘์— You can write Fortran in any language๋ผ๋Š” ๊ฒŒ ์žˆ๋‹ค. ํฌํŠธ๋ž€์€ ์ตœ์ดˆ์˜ (๋ช…๋ นํ˜•)ํ•˜์ด๋ ˆ๋ฒจ ์–ธ์–ด๋กœ ์—ฌ๊ฒจ์ง€๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์ธ๋ฐ, ์˜ค๋Š˜๋‚  ์„ธ๋Œ€์—๊ฒŒ๋Š” ๋ณดํ†ต C ์–ธ์–ด๊ฐ€ ์ € ์œ„์น˜์— ๋“ค์–ด๊ฐ„๋‹ค. ๋งํ•˜์ž๋ฉด, ์—„์ฒญ๋‚˜๊ฒŒ ๋งŽ์€ ๊ธฐ๋Šฅ์„ ํƒ‘์žฌํ•ด์„œ ๊ฑฐ์˜ ์ƒˆ๋กœ์šด ์–ธ์–ด๋ผ๊ณ  ๋ด๋„ ๋  ์ •๋„์ธ C++์—์„œ๋„ ๊ทธ๋Ÿฐ๊ฑฐ ๊นก๋ฌด์‹œํ•˜๊ฑฐ๋‚˜ ์•„์ฃผ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ƒ‰๋งŒ ๋งž์ถฐ๋†“๊ณ  ์‹ค์ƒ์€ C ์‹์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋งŽ๊ณ , ์—ญ์‹œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํฐ ํ˜์‹ ์„ ๊ฐ€์ ธ์™”๋˜ Java์—์„œ๋„ ๊ทธ๋ƒฅ C ์‹์œผ๋กœ ์ฝ”๋”ฉ์„ ํ•˜๋Š”[26] ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋งŽ๋‹ค๋Š” ์†Œ๋ฆฌ๋‹ค. ๋ฐ”๊ฟ”๋งํ•˜๋ฉด, ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์€ ํ•˜์Šค์ผˆ์ด๋‚˜ ๊ธฐํƒ€ ๋‹ค๋ฅธ ํŒจ๋Ÿฌ๋‹ค์ž„์˜, C ์‹์œผ๋กœ ์ฝ”๋”ฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์–ธ์–ด๋Š” ๊ฑฐ๋“ค๋– ๋„ ๋ณด์ง€ ์•Š๋Š”๋‹ค๋Š” ์†Œ๋ฆฌ. ์‚ฌ์‹ค ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹ค ๊ณ ๋ คํ•˜๋ฉด์„œ '์ œ๋Œ€๋กœ' ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๋Œ€์ถฉ ๋Œ์•„๊ฐ€๊ฒŒ๋งŒ ํ•˜๋Š” ๊ฒƒ๊ณผ์˜ ๋‚œ์ด๋„ ์ฐจ์ด๋Š” ์ƒ์ƒ์„ ์ดˆ์›”ํ•  ์ •๋„๋กœ ํฌ์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ์˜ค๋„ˆ์˜ ๋ˆˆ์—๋Š” ๋“ค์–ด๊ฐ€๋Š” ๋น„์šฉ๋งŒ ํฌ๊ฒŒ ๋ณด์ด๊ณ  ์‹ค์ œ ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๋ƒฅ ๋Œ์•„๊ฐ€๊ธฐ๋งŒ ํ•˜๋ฉด ๋ณ„๋ฐ˜ ์ฐจ์ด๊ฐ€ ์—†์–ด๋ณด์ด๋‹ˆ ๋‹น์—ฐํ•œ ๊ฒฐ๊ณผ๋ผ ํ•˜๊ฒ ๋‹ค.

๋˜ํ•œ, ์–ธ์–ด ์ž์ฒด์— ๋Œ€ํ•œ ๋น„ํŒ๋„ ์žˆ๋Š”๋ฐ, ์—ญ์‹œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์ธ SML์˜ ์ €์ž์ธ Robert Harper๊ฐ€ ์ •๋ฉด์œผ๋กœ ๋‚˜์„œ ๋น„ํŒ์„ ํ•˜์˜€๋‹ค. Laziness์™€ Type class ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๋น„ํŒ์ธ๋ฐ, ํฅ๋ฏธ๊ฐ€ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ์ง์ ‘ ์ฝ์–ด๋ณด์ž. laziness type class ๋‹ค๋งŒ, ์ด ์‚ฌ๋žŒ์€ CS ๊ต์ˆ˜์ด๋ฉด์„œ ๊ด€์‹ฌ๋ถ„์•ผ๋Š” proof theory, category theory ๋“ฑ ์ˆ˜๋ฆฌ๋…ผ๋ฆฌ ์ชฝ์œผ๋กœ ์ ๋ ค์žˆ์–ด, ์ˆ˜๋ฆฌ๋…ผ๋ฆฌ ์ „๊ณต์œผ๋กœ ๊ฝค ์ง€์‹์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ์ดํ•ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š”๊ฒŒ ํ•จ์ •.[27]

๊ตฌ๋ฏธ๊ถŒ์—์„œ๋„ ์ธ๊ธฐ๋Š” ๋ฐ”๋‹ฅ์„ ๊ธด๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์žฌ๊ท€๋ฌธ์€ ๋ฃจํ”„๋ฌธ์— ๋น„ํ•ด ์ฝ”๋“œ๋ฅผ ์งง๊ณ  ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ๊ฐ€๋…์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์žฅ์ ์ด ์žˆ์ง€๋งŒ, ๊ทธ ์žฌ๊ท€์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒƒ์€ ์ƒ๋‹นํ•œ ๋‘๋‡Œ๋…ธ๋™์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹จ์ ๋„ ์žˆ๋‹ค.(์ˆ˜ํ•™์—์„œ ์•„๋ฆ„๋‹ต๊ณ  ๊ฐ„๋‹จํ•œ ๊ณต์‹์ผ์ˆ˜๋ก ํƒ„์ƒํ•˜๋Š” ๊ณผ์ •(์ฆ๋ช…)์€ ๊ดด๋กœ์šด ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์€ ๊ฒƒ๊ณผ๋„ ์–ด๋А์ •๋„ ์ƒํ†ตํ•œ๋‹ค.) ์ด๋„ ๋ฌผ๋ก , ์žฌ๊ท€์ฝ”๋“œ์— ๋งŽ์ด ์ต์ˆ™ํ•ด์ง€๋ฉด ์–ด๋А์ •๋„ ํ•ด๊ฒฐ๋  ๋ฌธ์ œ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ์•„๋ฌด๋ฆฌ ๊ทธ๋ž˜๋„ ์ผ๋ฐ˜์ ์ธ Procedural language์ฒ˜๋Ÿผ ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์ผ๋‹จ ์จ๋‚ด๋ ค๊ฐ€๊ณ  ์‹คํ–‰-๋””๋ฒ„๊น…์œผ๋กœ ์™„์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์‹ค ์„œ๋กœ ์žฌ๊ท€(Mutual recursion)์™€ ๊ฐ„์ ‘ ์žฌ๊ท€(Indirect recursion)๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๊ทธ๋ƒฅ ์จ๋‚ด๋ ค๊ฐ€๋ฉด์„œ ๊ทธ๋•Œ๊ทธ๋•Œ ํ…Œ์ŠคํŠธ ๋Œ๋ฆฌ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์„ ์งค ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๊ฒŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋‡Œ๊ฐœ์กฐ๋ฅผ ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์ผ ๋ฟ. ํ˜น์ž๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ตฌ์กฐ๋ฅผ ์™„์ „ํžˆ ๋จธ๋ฆฌ์†์— ๋””์ž์ธํ•œ ํ›„์—์•ผ ์ฝ”๋”ฉ์ด ๊ฐ€๋Šฅํ•œ ์žฌ๊ท€์ฝ”๋“œ๊ฐ€ ์˜คํžˆ๋ ค ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šต๊ด€์— ๋„์›€์ด ๋œ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, ์ด๋ฏธ C/C++/Java ๋“ฑ์— ์ต์ˆ™ํ•œ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ์˜คํžˆ๋ ค ์ปค๋‹ค๋ž€ ์ง„์ž…์žฅ๋ฒฝ์ด ๋  ๋ฟ์ด๋‹ค. ํ˜„์žฌ Haskell์€ ์ œ๋Œ€๋กœ ๋œ ์ž…๋ฌธ์„œ์ ์„ ์ฐพ๊ธฐ๋„ ํž˜๋“  ์ƒํ™ฉ์ด๋‹ˆ... ๊ทธ๋‚˜๋งˆ ์ฝ”๋“œ์— ์ˆ˜ํ•™์ ์ธ ์š”์†Œ๊ฐ€ ๋งŽ๊ณ , ๋ˆ ์ฝ”์–ด๋Š” ๋„˜์ณ๋‚˜๋Š” High Frequency Trading Firm ๊ฐ™์€ ๊ธˆ์œต๊ณ„์—์„œ ์†Œ๊ทœ๋ชจ์ ์œผ๋กœ ์“ฐ๋Š” ์ •๋„.

๊ทธ ์™ธ์— ํ”„๋กœํŽ˜์…”๋„ํ•œ ๋ชฉ์ ๋ณด๋‹ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ž์ฒด๋ฅผ ์ข‹์•„ํ•˜๋Š” ์• ํ˜ธ๊ฐ€ ํ˜น์€ C/C++/Java ๋“ฑ์„ ๋ฉ”์ธ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ํ˜น์€ ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋Œ€ํ•œ ์ปจ์…‰์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ž์ฃผ ์„ ํƒํ•˜๋Š” ์–ธ์–ด์ด๋‹ค. ์ˆ˜ํ•™๊ณผ ๊ด€๋ จ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋…ผ๋ฆฌํ•™๊ณผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์ƒ๊ด€๊ด€๊ณ„ ๋ฐ ํƒ€ ์–ธ์–ด์— ๋น„ํ•ด ํฅ๋ฏธ๋กœ์šด ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ด๋ก ๋“ค์ด ๋งŽ์ด ์กด์žฌํ•˜๋ฉฐ ์žฌ๋ฏธ์žˆ๋Š” ํŠธ๋ฆญ๋„ ๋งŽ์ด ์ ์šฉ๊ฐ€๋Šฅํ•˜๊ณ , ์ˆ˜ํ•™์ ์ธ ๊ด€์ ์—์„œ ๋ณด๋‹ค ์•„๋ฆ„๋‹ค์šด(?) ์ฝ”๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌด์—‡๋ณด๋‹ค ํ˜„์žฌ ๋“ฑ์žฅํ•œ ๋ฉ”์ด์ € ํ•จ์ˆ˜ํ˜• ์–ธ์–ด ์ค‘์—์„  ๊ฐ€์žฅ ์—„๊ฒฉํ•˜๊ฒŒ ํ•จ์ˆ˜ํ˜• ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋”ฐ๋ฅด๋Š” ์–ธ์–ด์ด๊ธฐ ๋•Œ๋ฌธ์—[28] ์ข€ ์ƒ‰๋‹ค๋ฅธ ๊ฒƒ์„ ์ถ”๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค๋„ ๋งŽ์ด ์ฐพ๋Š”๋‹ค.

6. ํ•˜์Šค์ผˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ๋“ค[ํŽธ์ง‘]

๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ, ์œˆ๋„์šฐ๋ณด๋‹ค๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์• ํ˜ธ๊ฐ€๋“ค์˜ ์žฅ์ธ ์œ ๋‹‰์Šค ์ชฝ์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ๊ฒƒ์€ darcs ๋ผ๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ๊ณผ xmonad ๋ผ๋Š” ํƒ€์ผ๋ง ์œˆ๋„์šฐ ๋งค๋‹ˆ์ €์ด๋‹ค.

xmonad๋Š” dwm ์˜ ํ•˜์Šค์ผˆ ๋ฒ„์ „์ด๋‹ค. dwm ์˜ ํŠน์ง•์€ 1000 ์ค„ ๋ฏธ๋งŒ์˜ ๋‹จ์ผ C ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ์„ธํŒ…๋„ ํ—ค๋”ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋Š”์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ํ•˜๋“œ์ฝ”์–ด ์œˆ๋„์šฐ ๋งค๋‹ˆ์ €์ธ๋ฐ, xmonad ๋„ ์—ญ์‹œ ํ•˜์Šค์ผˆ ์†Œ์ŠคํŒŒ์ผ์„ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜๋Š”์‹์œผ๋กœ ์„ธํŒ…์ด ์ด๋ฃจ์–ด์ง€๋Š”๋ฐ, ํ•˜์Šค์ผˆ์ด๋ผ๋Š” ๊ณ ์ƒ์‚ฐ์„ฑ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋•์— dwm ์— ๋น„ํ•ด ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ํ›จ์”ฌ ๋งŽ๋‹ค. ๋‹ค๋งŒ, ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” 200 ๋ฉ”๊ฐ€๊ฐ€ ๋„˜๋Š” ghc ๋ผ๋Š” ์˜์กด์ด ๋”ธ๋ ค์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๊บผ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์ข…์ข… ์žˆ๋Š”ํŽธ. xmonad ์˜ ์ฝ”์–ด๋Š” ๋งค์šฐ ์ฃผ์˜๊นŠ๊ฒŒ ๋””์ž์ธ๋˜์—ˆ๊ณ , Coq ๋ผ๋Š” Theorem prover(์ˆ˜ํ•™์  ์ฆ๋ช… ๋ณด์กฐ ํ”„๋กœ๊ทธ๋žจ, 4์ƒ‰์ •๋ฆฌ๋„ ์ด ํ”„๋กœ๊ทธ๋žจ์˜ ๋„์›€์œผ๋กœ ์ฆ๋ช…๋˜์—ˆ๋‹ค.)๊นŒ์ง€ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š”๊ฒƒ์œผ๋กœ ์œ ๋ช…ํ•˜๋‹ค.

darcs ๋Š” ํ•˜์Šค์ผˆ ํ”„๋กœ๊ทธ๋žจ๋‹ต๊ฒŒ ๊ตฌ์กฐ์™€ ๋””์ž์ธ๋ฉด์—์„œ๋Š” ๋งŽ์€ ์ฐฌ์‚ฌ๋ฅผ ๋ฐ›๋Š” ๋ฒ„์ „ ์ปจํŠธ๋กค ์‹œ์Šคํ…œ์ด๋‹ค. ํ•˜์ง€๋งŒ, ํผํฌ๋จผ์Šค์—์„œ C ๋กœ ์งœ์—ฌ์ง„ git ์— ๋น„ํ•ด ๋งŽ์ด ๋ฐ€๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋Š” ์•Œ๋‹ค์‹œํ”ผ Git์— ๊ฑฐ์˜ ์ ๋ น๋‹นํ•œ ์ƒํƒœ. ํ•˜์Šค์ผˆ ์ปดํŒŒ์ผ๋Ÿฌ์ธ GHC์กฐ์ฐจ ๋งค์šฐ ๊ฑฐ๋Œ€ํ•ด์ง„ ๋ชธ์ง‘์„ ๊ฐ๋‹นํ•˜์ง€ ๋ชปํ•ด 2011๋…„ darcs์—์„œ Git์œผ๋กœ ๋„˜์–ด๊ฐ”๋‹ค. ์ƒˆ๋กœ์šด ์ด๋ก ์  ๋ฐฐ๊ฒฝยท๋””์ž์ธ์„ ๊ฐ€์ง„ Camp๊ฐ€ ์ค€๋น„๋˜๊ณ  ์žˆ๋‹ค. Camp๋Š” ์•„์ง ํฌ๋ง์ด ๋ณด์ด์ง€ ์•Š๊ณ , ๊ทธ์— ๋ฐ˜ํ•ด darcs ๋Š” http://darcs.net/Benchmarks์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ง€์†์ ์œผ๋กœ ํผํฌ๋จผ์Šค๊ฐ€ ๊ฐœ์„ ๋˜๊ณ  ์žˆ๋‹ค. Git์—๊ฒŒ ๋ฐ€๋ฆฌ๋Š” ๊ฒƒ์€ darcs๋Š” GitHub๋งŒํผ ํ›Œ๋ฅญํ•œ ์ ‘๊ทผ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” open source server๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ(...)์ด๋‹ค.

๋ฌธ์„œ ์ƒํ˜ธ ๋ณ€ํ™˜ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ Pandoc์ด ์žˆ๋‹ค. ๋งค์šฐ ๋„๋ฆฌ ์“ฐ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ, ์ฃผ๋กœ backend๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜ ์œ ์ €๋Š” ๊ทธ๋Ÿฐ๊ฒŒ ์žˆ๋Š”์ง€๋Š”๋„ ๋ชจ๋ฅธ๋‹ค. ์†Œ์Šค๋ฅผ ์ง์ ‘ compileํ•˜๋‹ค๋ณด๋ฉด ๊ฐ€๋” ์š”๊ตฌ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Haskell๋กœ ๋งŒ๋“  ์šด์˜์ฒด์ œ๋กœ. House๊ฐ€ ์žˆ๋‹ค. ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋กœ ์‹œ์Šคํ…œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ์ผ์ข…์˜ ๋„์ „๊ณผ์ œ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์ง€๋งŒ ๊ฝค ์ž˜ ์ž‘๋™ํ•œ๋‹ค. ๊ด€์‹ฌ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋ฐ›์•„์„œ ๋ถ„์„ํ•ด๋ณด๋Š” ๊ฒƒ๋„ ๊ดœ์ฐฎ์„๋“ฏ. ๋‹ค๋งŒ ํ˜„์žฌ์˜ ์ปดํ“จํ„ฐ ๊ตฌ์กฐ๋กœ๋Š” ์•„์ง ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ์žฅ์ ๊ณผ ์„ฑ๋Šฅ์„ ์‚ด๋ฆฌ๊ธฐ ์–ด๋ ต๊ธฐ์— ๋А๋ คํ„ฐ์ง„ ๊ฒƒ์€ ๊ฐ์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

2015๋…„์— ๊ณต๊ฐœ๋œ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋กœ๋Š” ํŽ˜์ด์Šค๋ถ์—์„œ ๊ณต๊ฐœํ•œ ์ŠคํŒธ ํ•„ํ„ฐ[29]์ธ Haxl๊ฐ€ ์žˆ๋‹ค. ๊ฐœ๋ฐœ ์ฑ…์ž„์ž์˜ ๋ง์„ ๋นŒ๋ฉด, ๊ธฐ์กด์˜ C++ ๋ฒ ์ด์Šค๋กœ ์ž‘์—…ํ•˜๋˜ FXL[30]์ด๋ผ๋Š” ๋ฌผ๊ฑด์œผ๋กœ๋Š” ๋ฌผ๋ฐ€๋“ฏ์ด ๋ฐ€๋ ค์˜ค๋Š” ์ŠคํŒธ์„ ๋„์ €ํžˆ ๊ฐ๋‹นํ•  ์ˆ˜ ์—†์–ด์„œ ํฌ๊ธฐํ•˜๊ณ  ํ•˜์Šค์ผˆ๋กœ ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์‹ค์ œ ์ƒํ™ฉ์—์„œ 20~30% ์ •๋„์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๊ณ , ํŠนํžˆ ๋ณต์žกํ•œ ๋ฌธ์ œ์ผ์ˆ˜๋ก ๋” ๋นจ๋ผ์กŒ๋‹ค๊ณ  ํ•œ๋‹ค.[31] ๋‹ค๋งŒ ํ•˜์Šค์ผˆ ๊ฐœ๋ฐœ์ž๋Š” ๊ตฌํ•˜๊ธฐ ์–ด๋ ค์›Œ์„œ, ์–ธ์  ๊ฐ€ Haxl์„ C++๋กœ ํฌํŒ…ํ•˜๋Š” ์ˆ˜์ˆœ์„ ๋ฐŸ์„์ง€๋„ ๋ชจ๋ฅธ๋‹ค๊ณ . ์‹ค์ œ๋กœ ์ด๋ฒˆ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ๊ณผ์ •์—๋งŒ ํ•˜์Šค์ผˆ ์–ธ์–ดยท์ปดํŒŒ์ผ๋Ÿฌ ํ†ฑ ๋””์ž์ด๋„ˆ๋งŒ ๋‘๋ช…์ด๋‚˜ ์ฐธ๊ฐ€ํ–ˆ๋‹ค(...). ์ธํ„ฐ๋ทฐ # # ํ•˜์Šค์ผˆ๋กœ ๋ญ˜ ํ–ˆ๋Š”์ง€ ๊ฐ„๋‹จํžˆ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋Š” ์Šฌ๋ผ์ด๋“œ

2017๋…„ 10์›” 1์ผ ๋ฐœํ–‰๋œ ์•”ํ˜ธํ™”ํ ์—์ด๋‹ค๊ฐ€ ํ•˜์Šค์ผˆ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค.

2019๋…„ GitHub์—์„œ ๊ฐœ๋ฐœํ•œ ์†Œ์Šค์ฝ”๋“œ ๋ถ„์„ ํ”„๋กœ๊ทธ๋žจ Semantics#๊ฐ€ ํ•˜์Šค์ผˆ๋กœ ์ž‘์„ฑ๋˜์—ˆ๋‹ค. ์™œ ํ•˜์Šค์ผˆ์„ ์„ ํƒํ–ˆ๋Š”์ง€ ์—ฌ๊ธฐ์— ์ž˜ ๋‚˜์™€์žˆ๋‹ค.

7. ๊ธฐํƒ€[ํŽธ์ง‘]

ํ•˜์Šค์ผˆ ์Šคํฌ๋ฆฝํŠธ๋Š” GHC๋กœ ์™„์ „ํžˆ ๊ธฐ๊ณ„์–ด ์ปดํŒŒ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ณ  GHCi์˜ ๊ฐ€์ƒ๊ธฐ๊ณ„ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ๋„ ์ž‘๋™ ๊ฐ€๋Šฅํ•˜๋‹ค. ๋˜ํ•œ ์Šคํฌ๋ฆฝํŠธ ์ค‘ .lhs๋ผ๋Š” ํ™•์žฅ์ž๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ๊ฐ€ ๋ฉ”์ธ์ด๊ณ  ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ฒ˜๋ฆฌํ•ด์„œ ์ž‘์„ฑํ–ˆ๋‹ค๊ฐ€ ์ปดํŒŒ์ผ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ญ˜ ๋งŒ๋“ค์–ด๋„ ์ฝ”๋“œ ์ž์ฒด๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ์งง๊ฒŒ ๋งŒ๋“ค์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์„์ด ๋ฉ”์ธ์ธ ์ฝ”๋“œ ํ˜•์‹์ด ์ƒ๊ธด ๊ฒƒ์ด๋‹ค. ๋‹ค๋งŒ haddock์„ ํ†ตํ•œ ๋ฌธ์„œํ™”๊ฐ€ ์ฃผ๋ฅ˜๊ฐ€ ๋˜๋ฉด์„œ .lhs๋Š” ์˜ˆ์ œ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์šฉ๋„ ์ •๋„๋กœ๋‚˜ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

ํ•˜์Šค์ผˆ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ๋กœ๋Š” http://learnyouahaskell.com/chapters๋‚˜ http://book.realworldhaskell.org/read/ ๋“ฑ์ด ์žˆ๋‹ค. ๋‹ค๋งŒ ์ด๊ณณ์˜ ๋‚ด์šฉ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์„ ๋Œ€์ƒ์œผ๋กœ ์“ฐ์—ฌ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ์‹ฌ์ž๊ฐ€ ์ด๊ฒƒ๋งŒ ๋ณด๊ณ  ํ•˜์Šค์ผˆ์„ ์ ‘ํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์›€์ด ํฌ๋‹ค.

ํ•˜์Šค์ผˆ ์ „์šฉ IDE์ธ Leksah[32] ๋˜ํ•œ ํ•˜์Šค์ผˆ๋กœ ๊ฐœ๋ฐœ๋๋‹ค. macOS์šฉ IDE์ธ Haskell for Mac์„ ์•ฑ ์Šคํ† ์–ด์—์„œ ๊ตฌ์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฃผ๋กœ ํ…์ŠคํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๊ณ  ghc๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด๋ผ๊ณค ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธํ•  ๋• :l ํ•˜๋‚˜๋ฉด ๋์ด๋‹ค์„ ์ผ๋ฐ˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ฒ˜๋Ÿผ ํŽธํ•˜๊ฒŒ ํ•ด์ค€๋‹ค. IntelliJ IDEA์—๋„ IntelliJ-Haskell์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋‹ค. IntelliJ ํ”Œ๋žซํผ์— ํž˜์ž…์€ ๊ฐ•๋ ฅํ•œ ์ฝ”๋“œ ์ปดํ”Œ๋ฆฌ์…˜ ๊ธฐ๋Šฅ๊ณผ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ ์™ธ์— ๋น„์ฃผ์–ผ ์ŠคํŠœ๋””์˜ค ์ฝ”๋“œ, Emacs ๋“ฑ์˜ ํ…์ŠคํŠธ ์—๋””ํ„ฐ ์—ญ์‹œ ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜•์‹์œผ๋กœ ํ•˜์Šค์ผˆ ์ฝ”๋“œ ํŽธ์ง‘์„ ์ง€์›ํ•œ๋‹ค.
[17] ์‚ฌ์‹ค JavaScript์˜ Promise๋Š” ๋ชจ๋‚˜๋“œ ๋ฒ•์น™์„ ๋งŒ์กฑํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์Šค์ผˆ์„ ์ œ์™ธํ•œ ์–ธ์–ด์—์„œ ๋ชจ๋‚˜๋“œ ๋ฒ•์น™๊นŒ์ง€ ๋งŒ์กฑํ•˜๋Š” ์ง„์งœ ๋ชจ๋‚˜๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋“œ๋ฌผ๋‹ค.
[18] ์‰ฝ๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ํ•œ์—†์ด ์‰ฝ๊ณ  ์–ด๋ ต๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ํ•œ์—†์ด ์–ด๋ ค์›Œ์ง„๋‹ค๊ณ  ๋ณด๋Š” ๊ฒƒ์ด ๋งž๋‹ค.
[19] ๋ง๊ทธ๋Œ€๋กœ ์ˆ˜ํ•™์˜ ํ•จ์ˆ˜์ด๋‹ค.
[20] ์‚ฌ์‹ค ํ•˜์Šค์ผˆ๋ฟ ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ์ด๋ก ์  ๊ธฐ๋ฐ˜์ด ฮป-calculus ๋ผ๊ณ  ๋ด๋„ ๊ณผ์–ธ์€ ์•„๋‹ˆ๋‹ค.
[21] ์ˆ˜ํ•™์  ๊ท€๋‚ฉ๋ฒ•์„ ๋– ์˜ฌ๋ฆฌ๋ฉด ๊ฐ„๋‹จํ•˜๋‹ค. ๋ฒ ์ด์Šค๊ฐ€ ๋˜๋Š” ๊ฐ์ฒด๋“ค์ด ์žˆ๊ณ , ๊ทธ ๊ฐ์ฒด๋“ค์„ ์ด์šฉํ•˜์—ฌ A, B ๊ฐ€ ํƒ€์ž…์ด๋ฉด Aโ†’B ๋„ ํƒ€์ž…์ด๋‹ค๊ฐ™์€ ์ •์˜๋ฅผ ์ฃผ๋ฉด, A ๊ฐ€ ํƒ€์ž…์ด๋ฉด Aโ†’A ๊ฐ€ ํƒ€์ž…์ด๊ณ , Aโ†’A ๊ฐ€ ํƒ€์ž…์ด๋ฉด (Aโ†’A)โ†’A ํ˜น์€ (Aโ†’A)โ†’(Aโ†’A) ๊ฐ€ ํƒ€์ž…์ด๊ณ ...ํ•˜๋Š”์‹์œผ๋กœ ์ฃฝ์ฃฝ ๋‚˜๊ฐ„๋‹ค. ์ด๋Ÿฐ ์ •์˜๋ฅผ inductive definition ์ด๋ผ ์นญํ•˜๋ฉฐ, ์ด๋Ÿฐ ์‹œ์Šคํ…œ์€ inductive structure ๋ผ๊ณ  ํ•œ๋‹ค. ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” ๋‹น์—ฐํžˆ ์ž์—ฐ์ˆ˜์ด๋‹ค.
[22] Co- ๋กœ ์‹œ์ž‘๋˜๋Š”๊ฒƒ๋“ค์€ mathematical dual ์ด๋ผ ํ•˜๋ฉฐ, '๋Œ€๋น„๋˜๋Š” ๊ฐœ๋…'์ •๋„๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, data ์˜ dual ์ธ Codata, ์žฌ๊ท€(Recursion)์˜ dual ์ธ Corecursion, ๊ท€๋‚ฉ์˜ dual ์ธ Coinduction ๋“ฑ์ด ์žˆ๋‹ค. dual ์„ ๊ตฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ทธ์— ๋Œ€ํ•œ ์ •ํ™•ํ•œ ์ˆ˜ํ•™์  ์ •์˜๋ฅผ ๋…ผ๋ฆฌ์‹์œผ๋กœ ํ’€์–ด์„œ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‚˜ Category theory ๋กœ ์ •์˜ํ•œ ํ›„, arrow ์˜ ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟ”์„œ ์–ป์–ด์ง€๋Š”๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
[23] ์ •์  ํƒ€์ž… ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž…๋ฌธํ•  ๋•Œ ์ฒ˜์Œ ๋ฐฐ์šฐ๋Š” ๊ธฐ๋ณธ ํƒ€์ž…ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜์ธ Applicative Functor๊ฐ€ 2008๋…„์ด ๋˜์–ด์„œ์•ผ ์ˆ˜ํ•™์ ์œผ๋กœ ๋ฐœ๊ฒฌ๋˜์—ˆ์„ ์ •๋„์ด๋‹ค.
[24] ๋‘ ๊ฐ€์ง€๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ณธ๋ž˜ ์˜๋„ํ•œ ์˜๋ฏธ๋Š” Avoid (success at all costs)์ด๊ณ , ์ง์—ญํ•˜๋ฉด "'๋ชจ๋“  ๋น„์šฉ ๋ฉด์—์„œ ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ'์„ ํ”ผํ•ด๋ผ"์ด๋‹ค. ์ข€ ๋” ํ’€์–ด์„œ ๋งํ•˜๋ฉด '(์–ธ์–ด์˜) ์„ฑ๊ณต์„ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ํƒ€ํ˜‘ํ•˜๋ ค๊ณ  ํ•˜์ง€ ๋งˆ๋ผ.' ๋Š” ๋œป์ด๋‹ค. ์ธ๊ธฐ์™€ ๋ฒ”์šฉ์„ฑ์„ ์œ„ํ•ด ์•ˆ์ „ํ•จ, ํ‘œํ˜„๋ ฅ, ํšจ์œจ์„ฑ ๋“ฑ ํ•˜์Šค์ผˆ์ด ๊ฐ€์ง„ ํŠน์ง•์„ ํฌ์ƒํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์˜๋ฏธ. ๋‹ค๋ฅด๊ฒŒ๋Š” ์ˆ˜๋‹จ๊ณผ ๋ฐฉ๋ฒ•์„ ๊ฐ€๋ฆฌ์ง€ ๋ง๊ณ  ์„ฑ๊ณต์„ ํ”ผํ•ด๋ผ(...) ๋ผ๋Š” ์˜๋ฏธ๋„ ๋œ๋‹ค.
[25] ํ•˜์Šค์ผˆ์˜ ๋น„๊ณต์‹์  ๋ชจํ† ๋กœ ๋„๋ฆฌ ์•Œ๋ ค์ง„ ๋ฐœ์–ธ
[26] ์ด๋ฅผ ์‹œ์ณ‡๋ง๋กœ '์”จ์ž๋ฐ”'๋ผ๊ณ  ํ•œ๋‹ค.
[27] ์‚ฌ์‹ค, CS ์ž์ฒด๋ฅผ ์‘์šฉ์ˆ˜๋ฆฌ๋…ผ๋ฆฌํ•™์œผ๋กœ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์„ ์ •๋„๋กœ ํ•œ๊ฑธ์Œ๋งŒ ๋„˜์–ด๊ฐ€๋ฉด ๋ถ€๋”ชํžˆ๋Š” ์˜์™ธ๋กœ ๊ฐ€๊นŒ์šด ๋ถ„์•ผ์ด๋‹ค.
[28] ์‚ฐ์—…๊ณ„ ์ชฝ์„ ์ค‘์‹œํ•˜๋Š” ํƒ€ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋“ค์€ Imperative/OOP ๋“ฑ๋„ ์ฒจ๊ฐ€ํ•˜์—ฌ ๋ฌ˜ํ•˜๊ฒŒ ์งฌ๋ฝ•๋œ ๊ฒฝํ–ฅ์ด ๊ฐ•ํ•œ๋ฐ ๋ฐ˜ํ•ด, ํ•˜์Šค์ผˆ์€ ๋ณด๋‹ค ์ˆœ์ˆ˜ํ•œ ์•„์นด๋ฐ๋ฏน ์„ฑํ–ฅ์ด ๊ฐ•ํ•˜๋‹ค.
[29] ๊ณต๊ฐœ๋œ ๋ถ€๋ถ„์€ ํ•„ํ„ฐ์˜ ์ผ๋ถ€์ธ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. ์ŠคํŒธ ํ•„ํ„ฐ ์ค‘์—์„œ ๊ฐ€์žฅ ๋ถ€ํ•˜๊ฐ€ ํฐ ๋ถ€๋ถ„์ด๋ผ๊ณ . ๋‹น์—ฐํ•˜์ง€๋งŒ ์ŠคํŒธ ํ•„ํ„ฐ ๊ทธ ์ž์ฒด๋Š” ๊ณต๊ฐœ ์•ˆ ํ–ˆ๋‹ค.
[30] 2013๋…„๋ถ€ํ„ฐ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค. ์ด ๋˜ํ•œ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด์˜ ํŠน์ง•์„ ๋”ฐ์˜จ DSL์ด์—ˆ๋‹ค. ํ•˜๋ฃจ์—๋„ ๋ช‡๋ฒˆ์ด๋‚˜ ์ฝ”๋“œ๊ฐ€ ๊ฐฑ์‹ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํ”„๋ฆฌํŒ…์„ ํ†ตํ•ด์„œ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๋„ˆ๋ฌด ๋А๋ ธ๋‹ค๊ณ . ๋Œ€์‹  ์ปดํŒŒ์ผํ•ด์„œ ์‹คํ–‰ยท๊ต์ฒด(hot code swapping: CPU๋‚˜ ํ•˜๋“œ๋””์Šคํฌ๋ฅผ ์‹คํ–‰์ค‘์— ๋ฐ”๊ฟ”๋ผ๋Š” ๋ฌ˜๊ธฐ hot swapping์˜ ์†Œํ”„ํŠธ์›จ์–ด ๋ฒ„์ „)ํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜์Šค์ผˆ์—๋Š” ์ƒ๋Œ€๊ฐ€ ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ .
[31] ๊ณต๊ฐœ๋œ ์ •๋ณด์— ๋”ฐ๋ฅด๋ฉด x3 ์ด์ƒ
[32] Haskel์„ ๋ฐ˜๋Œ€๋กœ ์“ด ๊ฒƒ.