๋ถ๋ฅ:์นผ/์ ๋จ๊ธฐ
์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
main = putStrLn "Hello, world!"
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 ๋ ๊ทธ๋ฅ ์ค๋ช ์ ์ํ ์์์ด๊ณ , ์ค์ ํ์ค์ผ์์๋
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์์ *๋ฅผ ๋๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ํจ์๋ผ๊ณ ์๊ฐํ๊ณ ๋ณดํต ํจ์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ด๋ค๋ฉด *(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๋ฅผ ๊ฐ์ง๋ ์ํ๋จธ์ ์ ๊ฒฝ์ฐ, ์ถ๋ ฅ๊ฐ์ ์ ๋ ฅ ๋ฟ๋ง ์๋๋ผ ๋จธ์ ์ ์ํ ์ญ์ ์ถ๋ ฅ์ ์ข์ฐํ ์ ์๋ค. ์ฆ, ๊ฐ์ ์ ๋ ฅ์ธ๋ฐ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฒ์ด ๋ฐ๋ก ๋ถ์ํจ๊ณผ๋ค.
ํ์ง๋ง ์์ํ ํจ์๋ค๋ก ๊ตฌ์ฑ๋ ํ๋ก๊ทธ๋จ์ ๋ถ์ํจ๊ณผ๊ฐ ์์ด ์คํ ์์์ ์ํฅ์์ ์์ ๋กญ๊ธฐ ๋๋ฌธ์ ๋ณํ์ฑ์ ๊ฐ์ง๊ธฐ ์ข๋ค. ๋ํ ๋ฃจํ๋ฌธ์ด ์๊ณ ์ ์ด๋ฌธ๋ ์์ฃผ ์ ์ผ๋ฉฐ, ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ ์ด๋ฌธ์ ์ฌ์ฉํ ํ์๊ฐ ์๋ค. ๋๋ถ๋ถ์ ๋ถ๊ธฐ๋ ํจํด ๋งค์นญ๊ณผ ๊ฐ๋์ ์ํด ๋ง๋ค์ด์ง๋ค.
ํ์ค์ผ์์์คํ
๋ ๋ฒจ๋ก ๋ญ ํ ๋ ๋นผ๊ณ ๋ ๋๊ตฌ๋ ์ ์ด๋ค. ์ฌ์ค ์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋จ์์ ์ฐ๋ฉด ์๋๋ ํจ์๋ค์ด๋ค. ๋ฑ์ ์ ์ธํ๋ฉด ์์ ํจ์ํ ์ธ์ด๋ก ๊ท์ ํ ์ ์๋ค.
์์ ํจ์ํ ์ธ์ด์์ ํจ์๋ ์ํ์์์ ํจ์์ ๊ฐ์์ ๋ถ์ํจ๊ณผ(๋๋ ๋ถ์์ฉ. 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)์ ๊ณ์ฐ์ด ํ์ํ ์๊ฐ๊น์ง ๊ณ์ฐ์ ๋ฏธ๋ฃจ์ด ๋๋ค๋ ์๋ฏธ๋ค. ๋ฐ๋ผ์ ๊ทธ๋ ๊ทธ๋ ํ์ํ ๋งํผ๋ง ๊ณ์ฐํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค. ์ด ๋๊ธํ ๊ณ์ฐ์ ๊ฐ๋
์ผ๋ก ์ธํ์ฌ ํ์ค์ผ์ ํ๋ก๊ทธ๋จ์ ๋ฌดํ์ ๊ฐ๋
์ ์ฝ๊ฒ ์ ์ฉํ ์ ์๋ค. ์๋ฅผ ๋ค์ด ์ด๋ค ๊ธธ์ด์ ์ ์ ์ ๊ณฑ ๋ฆฌ์คํธ๊ฐ ํ์ํ๋ค๋ฉด ์๋์ฒ๋ผ ๋ฌดํํ ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ฒ ํด๋ ์๊ด ์๋ค.
์ ์ฌํ ๋ฐฐ์ด์ ๋ง๋๋ JavaScript ์ฝ๋.
์ผ๋ฐ์ ์ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์งค์์ด ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ค ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฐ์ง ๋ฒ๊ทธ ์ฝ๋์ง๋ง[2] ๋๊ธํ ๊ณ์ฐ ํจ๋ฌ๋ค์์์๋ ์ด๋ฐ ๊ฒฝ์ฐ ๊ฐ์ด ํ์ํด์ง๊ธฐ ์ ๊น์ง ๊ณ์ฐ์ ๋ฏธ๋ฃจ๊ณ ์๋ค๊ฐ ๊ฐ์ ์์ฒญํ ๋ ๊ณ์ฐ์ ํด์ ๋ณด๋ด์ฃผ๊ธฐ ๋๋ฌธ์ ์๋ฌด ๋ฌธ์ ๊ฐ ์๋ค. ์คํ๋ ค ์ด๋ ๊ฒ ์ ์ํด๋๋ฉด ํ์ํ ๋ ํ์ํ ๋งํผ ๋์ ์ผ๋ก ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ฏ๋ก ์ ์ฐํ ํ๋ก๊ทธ๋๋ฐ์ ์ํด ํ์ํ ๊ฒฝ์ฐ์๋ ๋ฌดํ์ ์ฌ์ฉํ๋ ์ชฝ์ด ๊ถ์ฅ๋๋ค.
๊ณ์ฐ ๋ง๊ณ ํจํด๋งค์นญ์์๋ ๋๊ธํ ํจํด๋งค์นญ์ด๋ผ๋ ๊ฐ๋ ์ด ์๋๋ฐ, ๋๊ธํ ํจํด๋งค์นญ์ด๋ ํจํด์ด ์๋ง์๋ ์ผ๋จ ์ฐธ์ผ๋ก ๊ฐ์ ํด์ ํต๊ณผ์ํค๊ณ , ๊ทธ ํจํด์ด ์ค์ ์ฌ์ฉ๋ ๋๊ฐ ๋์ด์์ผ ํด๋น ํจํด์ ๋ณ์์ ๊ฐ์ ๋์ ํ๋๊ฒ์ด๋ค. ๋ฌธ๋ฒ์ ์ผ๋ก๋ ~ ๋ฅผ ์์ ๋ถ์ฌ ~pattern ์ ๋๋ก ์ฌ์ฉํ์ง๋ง, ๋ช๋ช ๊ฒฝ์ฐ์๋ ~ ๋ฅผ ๋ฐ๋ก ๋ถ์ด์ง ์์๋ ์๋ฌต์ ์ผ๋ก ์ ์ฉ๋๋ค.
-- ๋ฌดํํ ์ ์์ ์ ๊ณฑ ๋ฆฌ์คํธ๋ฅผ ๋ง๋๋, ํ์ค์ผ์์๋ ๊ถ์ฅ๋๋ ๋ฐฉ๋ฒ(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] ๋ฌผ๋ก , ์์ธ์ํฉ์ด ์๊ธฐ๋๋ฌธ์, ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ด์ผ๋ง ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ถ์ํ ๋ ๋ฒจ์ ๋ฎ์ถ์ด ์ต์ ํํ๊ณ ์ถ๊ฑฐ๋ ๊ด์ต์ ์ผ๋ก ๋ ผ๋ฆฌ์ ๋ฒ๊ทธ๋ฅผ ๋ง๊ธฐ ์ํด, ์ ์ ํ์๊ฐ ์๋๋ผ๋ ์ฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ , ๋ณดํต ์ด๋ฐ ์ ์ ํ์ ์ธ์ด๋ฅผ ์๊ฐํ๋ฉด ์ฝ๋ฉ์ ๊ทธ๋ฐ ํ์ ์ ํ๋ํ๋ ์ ์ด์ค์ผ ํด์ ๋ฒ๊ฑฐ๋กญ๊ธฐ ๋ง๋ จ์ด๋ค. ํ์ง๋ง, ํ์ค์ผ ์ฝ๋๋ฅผ ์ง์ ๋ณด๋ฉด, ํ์ด์ฌ์ด๋ Perl ๊ฐ์ ๋์ ํ์ ์ธ์ด์ฒ๋ผ ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ด๋์ ๋ถ๋ถ์ด ๋ณ๋ก ์๋ค. ์ค์ ๋ก, ํ์ค์ผ์ ๊ฐ๋ ฅํ Hindley-Milner ํ์ ์์คํ ์ ์ฌ์ฉํ์ฌ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ํ์ ์ ๋ช ์์ ์ผ๋ก ์ง์ ํ์ง ์์๋ ํจ์์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ์ ์ฐ์ฐ์ ๋ฐ ๊ธฐํ ์ ๋ณด๋ฅผ ํตํด ํด๋น ํจ์์ ํ์ ์ ์๋์ผ๋ก ์ฐ์ญํ๋ค.[3] ๋ฌผ๋ก , ์์ธ์ํฉ์ด ์๊ธฐ๋๋ฌธ์, ํ์ ์ ๋ช ์์ ์ผ๋ก ์ ์ด์ผ๋ง ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์ถ์ํ ๋ ๋ฒจ์ ๋ฎ์ถ์ด ์ต์ ํํ๊ณ ์ถ๊ฑฐ๋ ๊ด์ต์ ์ผ๋ก ๋ ผ๋ฆฌ์ ๋ฒ๊ทธ๋ฅผ ๋ง๊ธฐ ์ํด, ์ ์ ํ์๊ฐ ์๋๋ผ๋ ์ฐ๋ ๊ฒฝ์ฐ๋ ์๋ค.
3.5. ๋์์ ๋ฐ์ดํฐ ํ์ [ํธ์ง]
๋์์ ๋ฐ์ดํฐ ํ์
์(Algebraic Data Type, ADT) ํ์ค์ผ์์ ์๋ก์ด ๋ฐ์ดํฐ ํ์
์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ด๋ค. C์ struct, enum, union ๋ฑ๊ณผ ์ ์ฌํ์ง๋ง, ํจ์ฌ ์ ์ฐํ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ค์์ ์๋ฅผ ๋ณด์.
ํํธ, ํ์ค์ผ์์ ๋ฐ์ดํฐ ํ์ ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์ ์ ํ๋ผ๋ฉํฐ๋ก ๋ฐ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ํ์ ๋ค์ ๊ตฌ๋ถ์ง๊ธฐ ์ํด์ ํ์ค์ผ์ kind๋ผ๋ ๊ฐ๋ ์ ๊ฐ์ง๊ณ ์๋๋ฐ, kind๋ ๊ฐ๋จํ ๋งํด ํ์ ์ ํ์ ์ด๋ผ๊ณ ๋ณผ ์ ์๋ค. ์์์ ์ ์ํ ํ์ ๋ค์
์ด๊ฒ์ด ๋์ด ์๋๋ผ, ๋ค์์ฒ๋ผ ํ์ ์์ฑ์๋ฅผ ํ๋ผ๋ฉํฐ๋ก ๋ฐ๋ ํ์ ๋ ์ ์ํ ์ ์๋ค.
๋ํ ghc ์ปดํ์ผ๋ฌ๋ ์ด๋ฌํ ํ์ ์์คํ ์ ๋์ฑ ์ ์ฐํ๊ฒ ํ์ฅํ๋ GADT๋ฑ์ compiler extension์ ์ ๊ณตํ๋ค.
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] ๊ฐ๋จํ ๋งํ์๋ฉด, ์ ์ ๊ฐ ํ์ ์ ์ง์ ์ ์ํ ๋ ํ์ ๋ณ์
๊ทธ๋ฐ๋ฐ ํ์ค์ผ์ ํ์ ์์คํ ์ ์ด๋ค ํํ๋ก๋ down casting์ ํ์ฉํ์ง ์๋๋ค. ๋ฐ๋ผ์ ํ์ค์ผ์์
ํ์ค์ผ์ด down casting์ ๊ธ์งํ๋ ๊ฒ์ ์ธ์ด ๋์์ธ์ ์ธ ์ด์ ๊ฐ ์๋๋ฐ, ํ์ค์ผ์ down casting์ ๊ธ์งํ๋ฏ๋ก์ ad hoc polymorphism์ typeclass์ ์ธ์คํด์ค ์ ์์ ๊ฐ๋๋ค. ์ฆ typeclass์ ํจ์๊ฐ ์๋๋ฉด์ ๋คํ์ ์ผ๋ก ์์ฑ๋ ํจ์๋ ํญ์ ๋๊ฐ์ ๋ฐฉ์์ผ๋ก(uniformly) ์๋ํ๋ฉฐ, ์ด๋ฅผ parametricity๊ฐ ๋ณด์กด๋๋ค๊ณ ํํํ๋ค. parametricity๋ฅผ ๋ณด์กดํ๋ ๊ฒ์ ๋ํ ์ปดํ์ผ ์ดํ์ ํ์ ์ ๋ณด๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ฐ๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
typeclass๋ type๋ค์ ์งํฉ(์ฌ์ค class)์ด๋ผ๊ณ ์๊ฐํ ์ ์๋ค.[9] ์๋ฅผ ๋ค์ด, ์์๊ฐ ๋์๋น๊ต๊ฐ ๊ฐ๋ฅํ ํ์ ๋ค์ ๋ํด ์ ์ํ๊ณ ์ถ๋ค๋ฉด, ๋์๋น๊ต ํจ์
OOP ๋ณด๋ค ์ ์ฐํ ์์คํ ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ ๋ฐฉ๋ฒ๊ณผ ์ ๊ทผ๋ฐฉ์๋ง ์ด์ง ๋ค๋ฅผ ๋ฟ, OOP ๋ฅผ ๋ค์ดํฐ๋ธ OOP ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๊ฐ๊น์ด ์์ค์ผ๋ก ๊ฐ๋จํ ์๋ฎฌ๋ ์ด์ ํ์ฌ ์ฌ์ฉํ๋๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์๋ฅผ ๋ค์ด,
๋
typeclass๋ OOP์์ ๋ณด์ด๋ interface์ ์ ์ฌํ ๊ฐ๋ ์ด์ง๋ง, ๋ช๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค. ๊ฐ์ฅ ๋๋๋ฌ์ง๋ ์ฐจ์ด์ ์ ๋๋ถ๋ถ์ OOP์ธ์ด์์ interface๊ฐ ํ์ ์ ์ธ๊ณผ interface์ ๊ตฌํ์ ๋์์ ํด์ผํ๋ ๊ฒ์ ๋นํด, typeclass์ instance๋ ์ฝ๋์ ์๋ฌด ์์น์์๋ ์ ์ธํ ์ ์๋ค๋ ์ ์ด๋ค. ์ด๋ ์๋ก ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ์๋ typeclass์ ๋ฐ์ดํฐ ํ์ ์ ์ธ์คํด์ค๋ฅผ ๋ง๋๋๋ฑ ํจ์ฌ ์ ์ฐํ ์ฌ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค. ๋ํ interface๊ฐ
ํ์ค์ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก dynamic dispatch๋ฅผ ์ง์ํ์ง ์์ง๋ง, existential type์ด๋ผ๋ compiler extension์ ํตํด ๋น์ทํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. existential type์ ์๋์ ํ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์์ผ๋ฉด์ ํน์ ํ์ ํด๋์ค์ ์ธ์คํด์ค ์ ๋ณด๋ง์ ์ ์งํ ์ ์ ์๊ฒ ํด์ค๋ค . ์๋ฅผ๋ค์ด
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)๊ฐ ์ ์ง๋๋ฉฐ ๋์์ ๋ช ๋ นํ ์ธ์ด ๋ถ๋ถ๊ณผ ํจ์ํ ์ธ์ด ๋ถ๋ถ์ด ์๊ฒฉํ๊ฒ ๊ตฌ๋ถ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก, ๋ช ๋ นํ ์ธ์ด ๋ฒ ์ด์ค์ ํจ์ํ ํํ์ ์ถ๊ฐํ ์ธ์ด๋ค์ ๋ง๊ทธ๋๋ก ์ ๋ฐ 'ํํ'์ ๋๋ฅผ ์ง์ํ๋ ์ ๋๋ผ, ์ ๋ฐ ๊ตฌ๋ถ์ด ์กด์ฌํ์ง ์๊ณ ์์ด๋ ๊ฒฝํฅ์ด ์๋ค.
์ฌ์ค ๋ชจ๋๋๋ ํจ์ํ ํจ๋ฌ๋ค์์ ์์ฉํ๋ ์ธ์ด๋ผ๋ฉด ๋ชจ๋ ์ด๋ฅผ ๊ตฌํํ ์ ์๋ค. ํ์ค์ผ์์๋ ๋ชจ๋๋๋ ์ธ์ด ๋ ๋ฒจ์์ ๊ตฌํํ ๊ตฌ์กฐ๊ฐ ์๋๋ผ, ์๋ง์ ํ์ ํด๋์ค ๊ตฌํ ์ค
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]
ํ๋ก๊ทธ๋๋ฐ์ ์ํ, ํนํ ์๋ฆฌ๋ ผ๋ฆฌ์์ ๋ฐฐ์ด์ฌ๋์ ๋ณดํต ฮป-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๋ 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 ๋ฑ์ ๋ฉ์ธ์ธ์ด๋ก ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋จธ๋ค์ด ํจ์ํ ์ธ์ด ํน์ ํจ์ํ ํจ๋ฌ๋ค์์ ๋ํ ์ปจ์ ์ ์ดํดํ๊ธฐ ์ํด ์์ฃผ ์ ํํ๋ ์ธ์ด์ด๋ค. ์ํ๊ณผ ๊ด๋ จ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ๋ ผ๋ฆฌํ๊ณผ ํ๋ก๊ทธ๋๋ฐ์ ์๊ด๊ด๊ณ ๋ฐ ํ ์ธ์ด์ ๋นํด ํฅ๋ฏธ๋ก์ด ๋ฐฑ๊ทธ๋ผ์ด๋ ์ด๋ก ๋ค์ด ๋ง์ด ์กด์ฌํ๋ฉฐ ์ฌ๋ฏธ์๋ ํธ๋ฆญ๋ ๋ง์ด ์ ์ฉ๊ฐ๋ฅํ๊ณ , ์ํ์ ์ธ ๊ด์ ์์ ๋ณด๋ค ์๋ฆ๋ค์ด(?) ์ฝ๋๋ฅผ ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฌด์๋ณด๋ค ํ์ฌ ๋ฑ์ฅํ ๋ฉ์ด์ ํจ์ํ ์ธ์ด ์ค์์ ๊ฐ์ฅ ์๊ฒฉํ๊ฒ ํจ์ํ ํจ๋ฌ๋ค์์ ๋ฐ๋ฅด๋ ์ธ์ด์ด๊ธฐ ๋๋ฌธ์[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#๊ฐ ํ์ค์ผ๋ก ์์ฑ๋์๋ค. ์ ํ์ค์ผ์ ์ ํํ๋์ง ์ฌ๊ธฐ์ ์ ๋์์๋ค.
xmonad๋ dwm ์ ํ์ค์ผ ๋ฒ์ ์ด๋ค. dwm ์ ํน์ง์ 1000 ์ค ๋ฏธ๋ง์ ๋จ์ผ C ํ๋ก๊ทธ๋จ์ผ๋ก, ์ธํ ๋ ํค๋ํ์ผ์ ๋ณ๊ฒฝํ๋์์ผ๋ก ์ด๋ฃจ์ด์ง๋ ํ๋์ฝ์ด ์๋์ฐ ๋งค๋์ ์ธ๋ฐ, xmonad ๋ ์ญ์ ํ์ค์ผ ์์คํ์ผ์ ์ง์ ๋ณ๊ฒฝํ๋์์ผ๋ก ์ธํ ์ด ์ด๋ฃจ์ด์ง๋๋ฐ, ํ์ค์ผ์ด๋ผ๋ ๊ณ ์์ฐ์ฑ ์ธ์ด๋ฅผ ์ฌ์ฉํ๋์ dwm ์ ๋นํด ์ง์ํ๋ ๊ธฐ๋ฅ์ด ํจ์ฌ ๋ง๋ค. ๋ค๋ง, ์ฌ์ฉํ๊ธฐ ์ํด์๋ 200 ๋ฉ๊ฐ๊ฐ ๋๋ ghc ๋ผ๋ ์์กด์ด ๋ธ๋ ค์ค๊ธฐ ๋๋ฌธ์ ๊บผ๋ฆฌ๋ ์ฌ๋๋ค๋ ์ข ์ข ์๋ํธ. xmonad ์ ์ฝ์ด๋ ๋งค์ฐ ์ฃผ์๊น๊ฒ ๋์์ธ๋์๊ณ , Coq ๋ผ๋ Theorem prover(์ํ์ ์ฆ๋ช ๋ณด์กฐ ํ๋ก๊ทธ๋จ, 4์์ ๋ฆฌ๋ ์ด ํ๋ก๊ทธ๋จ์ ๋์์ผ๋ก ์ฆ๋ช ๋์๋ค.)๊น์ง ์ฌ์ฉํ์ฌ ๊ฒ์ฆํ๋๊ฒ์ผ๋ก ์ ๋ช ํ๋ค.
darcs ๋ ํ์ค์ผ ํ๋ก๊ทธ๋จ๋ต๊ฒ ๊ตฌ์กฐ์ ๋์์ธ๋ฉด์์๋ ๋ง์ ์ฐฌ์ฌ๋ฅผ ๋ฐ๋ ๋ฒ์ ์ปจํธ๋กค ์์คํ ์ด๋ค.
๋ฌธ์ ์ํธ ๋ณํ ํ๋ก๊ทธ๋จ์ผ๋ก ํ๋ก๊ทธ๋จ/๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก์ Pandoc์ด ์๋ค. ๋งค์ฐ ๋๋ฆฌ ์ฐ์ด๋ ํ๋ก๊ทธ๋จ์ด์ง๋ง, ์ฃผ๋ก backend๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ผ๋ฐ ์ ์ ๋ ๊ทธ๋ฐ๊ฒ ์๋์ง๋๋ ๋ชจ๋ฅธ๋ค. ์์ค๋ฅผ ์ง์ compileํ๋ค๋ณด๋ฉด ๊ฐ๋ ์๊ตฌ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Haskell๋ก ๋ง๋ ์ด์์ฒด์ ๋ก. House๊ฐ ์๋ค. ํจ์ํ ์ธ์ด๋ก ์์คํ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ์ผ์ข ์ ๋์ ๊ณผ์ ๋น์ทํ ๊ฐ๋ ์ด์ง๋ง ๊ฝค ์ ์๋ํ๋ค. ๊ด์ฌ์๋ ์ฌ๋์ ๋ฐ์์ ๋ถ์ํด๋ณด๋ ๊ฒ๋ ๊ด์ฐฎ์๋ฏ. ๋ค๋ง ํ์ฌ์ ์ปดํจํฐ ๊ตฌ์กฐ๋ก๋ ์์ง ํจ์ํ ์ธ์ด์ ์ฅ์ ๊ณผ ์ฑ๋ฅ์ ์ด๋ฆฌ๊ธฐ ์ด๋ ต๊ธฐ์ ๋๋ คํฐ์ง ๊ฒ์ ๊ฐ์ํด์ผ ํ๋ค.
2015๋ ์ ๊ณต๊ฐ๋ ์คํ์์ค ํ๋ก์ ํธ๋ก๋ ํ์ด์ค๋ถ์์ ๊ณต๊ฐํ ์คํธ ํํฐ[29]์ธ Haxl๊ฐ ์๋ค. ๊ฐ๋ฐ ์ฑ ์์์ ๋ง์ ๋น๋ฉด, ๊ธฐ์กด์ C++ ๋ฒ ์ด์ค๋ก ์์ ํ๋ FXL[30]์ด๋ผ๋ ๋ฌผ๊ฑด์ผ๋ก๋
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 ๋ฑ์ ํ
์คํธ ์๋ํฐ ์ญ์ ํ๋ฌ๊ทธ์ธ ํ์์ผ๋ก ํ์ค์ผ ์ฝ๋ ํธ์ง์ ์ง์ํ๋ค.
ํ์ค์ผ์ ๋ฐฐ์ธ ์ ์๋ ์น์ฌ์ดํธ๋ก๋ http://learnyouahaskell.com/chapters๋ http://book.realworldhaskell.org/read/ ๋ฑ์ด ์๋ค. ๋ค๋ง ์ด๊ณณ์ ๋ด์ฉ์ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์๋ ์ฌ๋์ ๋์์ผ๋ก ์ฐ์ฌ ์์ผ๋ฏ๋ก ์ด์ฌ์๊ฐ ์ด๊ฒ๋ง ๋ณด๊ณ ํ์ค์ผ์ ์ ํ๊ธฐ์๋ ์ด๋ ค์์ด ํฌ๋ค.
ํ์ค์ผ ์ ์ฉ IDE์ธ Leksah[32] ๋ํ ํ์ค์ผ๋ก ๊ฐ๋ฐ๋๋ค. macOS์ฉ IDE์ธ Haskell for Mac์ ์ฑ ์คํ ์ด์์ ๊ตฌ์ ํ ์ ์๋ค. ์ฃผ๋ก ํ ์คํธ ํ์ผ์ ์์ฑํ๊ณ ghc๋ก ์ปดํ์ผํ๋ ๋ฒ๊ฑฐ๋ก์
[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์ ๋ฐ๋๋ก ์ด ๊ฒ.