๐ง Haskell๋ก ๋ฐฐ์ฐ๋ ํ์ ์์คํ ์ค๊ณ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ ๋ง ํฅ๋ฏธ์ง์งํ ์ฃผ์ ๋ก ์ฌ๋ฌ๋ถ๊ณผ ํจ๊ป ์ด์ผ๊ธฐ๋ฅผ ๋๋ ๋ณด๋ ค๊ณ ํด์. ๋ฐ๋ก "Haskell๋ก ๋ฐฐ์ฐ๋ ํ์ ์์คํ ์ค๊ณ"์ ๋ํด์์ฃ ! ๐ ์ด ์ฃผ์ , ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ์ฐ๋ฆฌ ํจ๊ป ์ฌ๋ฏธ์๊ฒ ํํค์ณ ๋ณผ ๊ฑฐ์์. ๋ง์น ์นดํก์ผ๋ก ์๋ค ๋จ๋ฏ์ด ํธํ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์. ใ ใ ใ
๊ทธ๋ผ ์ด์ ๋ถํฐ Haskell์ ์ธ๊ณ๋ก ๋น ์ ธ๋ณผ๊น์? ๐ ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋ง์น ์ฌ๋ฅ๋ท์์ ์๋ก์ด ์ฌ๋ฅ์ ๋ฐ๊ฒฌํ๋ ๊ฒ์ฒ๋ผ ์ ์ ํ๊ณ ํฅ๋ฏธ์ง์งํ ๊ฑฐ์์!
๐ ์ ๊น! ์๊ณ ๊ณ์ จ๋์?
Haskell์ ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ก, 1990๋ ์ ์ฒ์ ๋ฐํ๋์์ด์. ์ํ์์ด์ ๋ ผ๋ฆฌํ์์ธ Haskell Brooks Curry์ ์ด๋ฆ์ ๋ฐ์ ์ง์ด์ก๋ต๋๋ค. ๋ฉ์ง์ฃ ? ๐
1. Haskell, ๋ ๋๊ตฌ๋? ๐ค
์, ์ฌ๋ฌ๋ถ! Haskell์ด๋ผ๋ ์ด๋ฆ์ ๋ค์ด๋ณด์ จ๋์? ์๋๋ฉด "ํ, ๊ทธ๊ฒ ๋ญ์ผ?"๋ผ๊ณ ์๊ฐํ๊ณ ๊ณ์ ๊ฐ์? ใ ใ ใ ๊ฑฑ์ ๋ง์ธ์. ์ง๊ธ๋ถํฐ Haskell์ ๋ํด ์์๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณผ๊ฒ์.
Haskell์ ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๊ณ ์? ์ฝ๊ฒ ๋งํด์, Haskell์ ์ํ์ ์ธ ํจ์์ฒ๋ผ ๋์ํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋๋ ์ธ์ด๋ผ๊ณ ํ ์ ์์ด์. ๐์๋ฅผ ๋ค์ด๋ณผ๊น์? ์ฐ๋ฆฌ๊ฐ ์ผ์์์ ์ฌ์ฉํ๋ ์ํ ํจ์๋ฅผ ์๊ฐํด๋ณด์ธ์.
f(x) = x + 2
์ด ํจ์๋ ํญ์ ๊ฐ์ ์ ๋ ฅ์ ๋ํด ๊ฐ์ ์ถ๋ ฅ์ ๋ด๋์ฃ ? Haskell์ ํจ์๋ค๋ ์ด์ ๋น์ทํด์. ํญ์ ์์ธก ๊ฐ๋ฅํ๊ณ , ๋ถ์์ฉ์ด ์์ด์. ์ด๋ฐ ํน์ฑ ๋๋ฌธ์ Haskell๋ก ๋ง๋ ํ๋ก๊ทธ๋จ์ ๋ฒ๊ทธ๊ฐ ์ ๊ณ ์์ ์ ์ด๋๋๋ค. ๐
๐ก ์ฌ๋ฅ๋ท Tip!
ํ๋ก๊ทธ๋๋ฐ ์ค๋ ฅ์ ํฅ์์ํค๊ณ ์ถ์ผ์ ๊ฐ์? ์ฌ๋ฅ๋ท์์ Haskell ํํฐ๋ฅผ ์ฐพ์๋ณด์ธ์! ์ ๋ฌธ๊ฐ์ ๋์์ ๋ฐ์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ธ๊ณ๋ก ๋น ๋ฅด๊ฒ ์ง์ ํ ์ ์๋ต๋๋ค. ๐
2. ํ์ ์์คํ , ์ด๊ฒ ๋ญ๊ธธ๋? ๐ง
์, ์ด์ "ํ์ ์์คํ "์ด๋ผ๋ ๊ฒ์ ๋ํด ์์๋ณผ ์ฐจ๋ก์์. ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด๋ ์ด ๋จ์ด, ์ฌ์ค ์ฐ๋ฆฌ ์ผ์ ์ํ์์๋ ์ฝ๊ฒ ์ฐพ์๋ณผ ์ ์๋ต๋๋ค!
ํ์ ์์คํ ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฅํ๊ณ ์กฐ์งํํ๋ ๋ฐฉ๋ฒ์ด์์.
์ฝ๊ฒ ๋งํด์, ์ฐ๋ฆฌ๊ฐ ์ท์ฅ์ ์ ๋ฆฌํ ๋ ํฐ์ ์ธ , ๋ฐ์ง, ์๋ง ๋ฑ์ผ๋ก ๊ตฌ๋ถํ๋ ๊ฒ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋ผ์. ใ ใ ใ ์๋ฅผ ๋ค์ด๋ณผ๊น์?
let age: Int = 25
let name: String = "๊น์ฒ ์"
์ฌ๊ธฐ์ Int
์ String
์ด ๋ฐ๋ก ํ์
์ด์์. age
๋ ์ซ์(์ ์)๋ง ๋ด์ ์ ์๊ณ , name
์ ๋ฌธ์์ด๋ง ๋ด์ ์ ์์ฃ . ์ด๋ ๊ฒ ํ์
์ ์ง์ ํด๋๋ฉด ์ค์๋ก ๋์ด์ ์ด๋ฆ์ ๋ฃ๊ฑฐ๋, ์ด๋ฆ์ ์ซ์๋ฅผ ๋ฃ๋ ์ค์๋ฅผ ๋ฐฉ์งํ ์ ์์ด์. ๐
์ด ๊ทธ๋ฆผ์ฒ๋ผ, ํ์ ์์คํ ์ ์ฐ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊น๋ํ๊ฒ ์ ๋ฆฌํด์ฃผ๋ ์ญํ ์ ํด์. ๊ฐ๊ฐ์ "์๋"(ํ์ )์ ์๋ง์ "์ท"(๋ฐ์ดํฐ)์ ๋ฃ์ด๋๋ ๊ฑฐ์ฃ . ์ด๋ ๊ฒ ํ๋ฉด ๋์ค์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ๋ ์ฝ๊ณ , ์ค์๋ก ์๋ชป๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ํ๋ฅ ๋ ์ค์ด๋ค์ด์. ๐
3. Haskell์ ํ์ ์์คํ , ๋ญ๊ฐ ํน๋ณํด? ๐
์, ์ด์ Haskell์ ํ์ ์์คํ ์ด ๋ญ๊ฐ ๊ทธ๋ ๊ฒ ํน๋ณํ์ง ์์๋ณผ๊น์? Haskell์ ํ์ ์์คํ ์ ๋ง์น ์ด๋ฅ๋ ฅ์ ๊ฐ์ง ๊ฒ์ฒ๋ผ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํด์! ๐ฒ
Haskell์ ํ์ ์์คํ ์ ์ ์ ์ด๋ฉด์๋ ๊ฐ๋ ฅํ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด์.
์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๊ณ ์? ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์!- ์ ์ ํ์ ์์คํ : ํ๋ก๊ทธ๋จ์ ์คํํ๊ธฐ ์ ์ ๋ชจ๋ ํ์ ์ ๊ฒ์ฌํด์. ๋ง์น ์๋ฆฌ๋ฅผ ์์ํ๊ธฐ ์ ์ ๋ชจ๋ ์ฌ๋ฃ๊ฐ ์ ๋๋ก ์ค๋น๋์๋์ง ํ์ธํ๋ ๊ฒ๊ณผ ๋น์ทํ์ฃ .
- ๊ฐ๋ ฅํ ํ์ ์ถ๋ก : ์ฌ๋ฌ๋ถ์ด ์ผ์ผ์ด ํ์ ์ ๋ช ์ํ์ง ์์๋, Haskell์ด ์์์ ํ์ ์ ์ถ์ธกํด์ค์. ๋ง๋ฒ์ฒ๋ผ ๋ณด์ด์ง ์๋์? ใ ใ ใ
์๋ฅผ ๋ค์ด๋ณผ๊น์?
add x y = x + y
์ด ์ฝ๋๋ฅผ ๋ณด๋ฉด, ์ฐ๋ฆฌ๋ x
์ y
์ ํ์
์ ๋ช
์ํ์ง ์์์ด์. ํ์ง๋ง Haskell์ ์ด ํจ์๊ฐ ์ซ์๋ฅผ ๋ํ๋ ํจ์๋ผ๋ ๊ฒ์ ์์์ฑ๊ณ , ์๋์ผ๋ก x
์ y
๋ฅผ ์ซ์ ํ์
์ผ๋ก ์ถ๋ก ํด์. ๋๋ฐ์ด์ฃ ? ๐ฎ
๐ ์์ธ์ ์ก
Haskell์ ํ์ ์ถ๋ก ๊ธฐ๋ฅ์ Hindley-Milner ํ์ ์์คํ ์ ๊ธฐ๋ฐ์ผ๋ก ํด์. ์ด ์์คํ ์ 1969๋ ์ ์ฒ์ ์ ์๋์์ง๋ง, ์ง๊ธ๊น์ง๋ ํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํฐ ์ํฅ์ ๋ฏธ์น๊ณ ์๋ต๋๋ค!
4. Haskell์ ํ์ , ์ด๋ค ๊ฒ๋ค์ด ์์๊น? ๐งฉ
Haskell์๋ ๋ค์ํ ํ์ ๋ค์ด ์์ด์. ๋ง์น ๋ ๊ณ ๋ธ๋ก์ฒ๋ผ, ์ด ํ์ ๋ค์ ์กฐํฉํด์ ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ๋ง๋ค ์ ์์ฃ . ์ง๊ธ๋ถํฐ Haskell์ ์ฃผ์ ํ์ ๋ค์ ์์๋ณผ๊ฒ์!
4.1. ๊ธฐ๋ณธ ํ์ (Basic Types) ๐ค
Int
: ์ ์๋ฅผ ๋ํ๋ด์. ์: 1, 42, -10Float
: ์์์ ์ด ์๋ ์ซ์๋ฅผ ๋ํ๋ด์. ์: 3.14, -0.01Double
: Float๋ณด๋ค ๋ ์ ๋ฐํ ์์์ ์ซ์์์.Bool
: ์ฐธ(True)๊ณผ ๊ฑฐ์ง(False)์ ๋ํ๋ด์.Char
: ํ๋์ ๋ฌธ์๋ฅผ ๋ํ๋ด์. ์: 'a', '1', '!'String
: ๋ฌธ์์ด์ ๋ํ๋ด์. ์ฌ์ค ์ด๊ฑด [Char]์ ๋ณ์นญ์ด์์!
์ด ๊ธฐ๋ณธ ํ์ ๋ค์ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ๋ง์ด ๋ณผ ์ ์๋ ๊ฒ๋ค์ด์ฃ ? ํ์ง๋ง Haskell์์๋ ์ด ๊ธฐ๋ณธ ํ์ ๋ค์ ๊ฐ์ง๊ณ ๋ ๋ณต์กํ๊ณ ๊ฐ๋ ฅํ ํ์ ๋ค์ ๋ง๋ค์ด๋ผ ์ ์์ด์. ๐
4.2. ๋ฆฌ์คํธ (List) ๐
๋ฆฌ์คํธ๋ ๊ฐ์ ํ์
์ ๊ฐ๋ค์ ์ฌ๋ฌ ๊ฐ ๋ชจ์๋์ ๊ฑฐ์์. ๋๊ดํธ []
๋ก ํํํด์.
numbers = [1, 2, 3, 4, 5] -- Int ๋ฆฌ์คํธ
fruits = ["apple", "banana", "cherry"] -- String ๋ฆฌ์คํธ
๋ฆฌ์คํธ๋ ์ ๋ง ์ ์ฉํด์! ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ๋ถ์ด ์ฌ๋ฅ๋ท์์ ๊ด์ฌ ์๋ ์ฌ๋ฅ๋ค์ ๋ชฉ๋ก์ ๋ง๋ค ๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ฃ ? ใ ใ ใ
4.3. ํํ (Tuple) ๐ญ
ํํ์ ์๋ก ๋ค๋ฅธ ํ์
์ ๊ฐ๋ค์ ๋ฌถ์ด๋์ ๊ฑฐ์์. ์๊ดํธ ()
๋ก ํํํด์.
person = ("John Doe", 30) -- (String, Int) ํํ
point = (3.5, 2.0) -- (Float, Float) ํํ
ํํ์ ์ฌ๋ฌ ๊ฐ์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ํ๋๋ก ๋ฌถ์ ๋ ์ ์ฉํด์. ์๋ฅผ ๋ค์ด, ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ๋์ด๋ฅผ ํจ๊ป ์ ์ฅํ ๋ ํํ์ ์ฌ์ฉํ ์ ์๊ฒ ๋ค์!
4.4. ํจ์ ํ์ (Function Type) ๐ง
Haskell์์๋ ํจ์๋ ํ๋์ ํ์
์ด์์. ํจ์ ํ์
์ ํ์ดํ ->
๋ก ํํํด์.
add :: Int -> Int -> Int
add x y = x + y
์ด ์ฝ๋์์ ::
๋ "ํ์
์ด ...์ด๋ค"๋ผ๋ ๋ป์ด์์. ์ฆ, add
ํจ์๋ Int๋ฅผ ๋ฐ์์, ๋ค์ Int๋ฅผ ๋ฐ์์, ์ต์ข
์ ์ผ๋ก Int๋ฅผ ๋ฐํํ๋ค๋ ๋ป์ด์ฃ .
ํจ์ ํ์ ์ ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ๋ค์ ์กฐํฉํ ๋ ์ฌ์ฉํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๋์์ธ ์ฌ๋ฅ๊ณผ ์ฝ๋ฉ ์ฌ๋ฅ์ ๊ฒฐํฉํด์ ์๋ก์ด ์๋น์ค๋ฅผ ๋ง๋ค ๋ ํจ์ ํ์ ์ ํ์ฉํ ์ ์๊ฒ ์ฃ ? ๐
4.5. ๋์์ ๋ฐ์ดํฐ ํ์ (Algebraic Data Type) ๐งฌ
์ด์ Haskell์ ์ง์ง ๊ฐ์ ์ธ ๋์์ ๋ฐ์ดํฐ ํ์ ์ ๋ํด ์์๋ณผ๊น์? ์ด๊ฑด ์ข ์ด๋ ค์ธ ์ ์์ง๋ง, ์ ๋ง ๊ฐ๋ ฅํ๊ณ ์ ์ฉํด์!
๋์์ ๋ฐ์ดํฐ ํ์ ์ ์ฌ๋ฌ๋ถ๋ง์ ์๋ก์ด ํ์ ์ ๋ง๋ค ์ ์๊ฒ ํด์ค์.
๋ง์น ๋ ๊ณ ๋ธ๋ก์ผ๋ก ์๋ก์ด ๋ชจ์์ ๋ง๋๋ ๊ฒ์ฒ๋ผ์!์๋ฅผ ๋ค์ด๋ณผ๊ฒ์:
data Color = Red | Green | Blue
์ด ์ฝ๋๋ Color
๋ผ๋ ์๋ก์ด ํ์
์ ๋ง๋ค๊ณ , ์ด ํ์
์ Red
, Green
, Blue
์ค ํ๋์ ๊ฐ์ ๊ฐ์ง ์ ์๋ค๊ณ ์ ์ํ๋ ๊ฑฐ์์.
๋ ๋ณต์กํ ์์ ๋ ๋ณผ๊น์?
data Shape = Circle Float | Rectangle Float Float
์ด ์ฝ๋๋ Shape
๋ผ๋ ํ์
์ ๋ง๋ค๊ณ , ์ด ํ์
์ Circle
(๋ฐ์ง๋ฆ์ ๋ํ๋ด๋ Float ๊ฐ์ ๊ฐ์ง) ๋๋ Rectangle
(๊ฐ๋ก์ ์ธ๋ก๋ฅผ ๋ํ๋ด๋ ๋ ๊ฐ์ Float ๊ฐ์ ๊ฐ์ง) ์ค ํ๋๊ฐ ๋ ์ ์๋ค๊ณ ์ ์ํด์.
์ด๋ฐ ์์ผ๋ก ์ฌ๋ฌ๋ถ๋ง์ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ๋ค์ ํํํ ๋ ์ด๋ฐ ๋์์ ๋ฐ์ดํฐ ํ์ ์ ํ์ฉํ๋ฉด ์ ๋ง ์ ์ฉํ ๊ฑฐ์์! ๐
5. Haskell์ ํ์ ํด๋์ค, ์ด๊ฒ ๋ญ์ง? ๐ค
์, ์ด์ Haskell์ ๋ ๋ค๋ฅธ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ธ ํ์ ํด๋์ค์ ๋ํด ์์๋ณผ ์ฐจ๋ก์์. ํ์ ํด๋์ค๋ผ๊ณ ํ๋๊น ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ฃ ? ํ์ง๋ง ๊ฑฑ์ ๋ง์ธ์. ์ฝ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์! ใ ใ ใ
ํ์ ํด๋์ค๋ ๋น์ทํ ๋์์ ํ๋ ํ์ ๋ค์ ๊ทธ๋ฃนํํ ๊ฑฐ์์.
์ฝ๊ฒ ๋งํด์, ํน์ ํ ๋ฅ๋ ฅ์ ๊ฐ์ง ํ์ ๋ค์ ๋ชจ์์ด๋ผ๊ณ ์๊ฐํ๋ฉด ๋ผ์.์๋ฅผ ๋ค์ด๋ณผ๊น์? ์ฐ๋ฆฌ ์ฃผ๋ณ์์ "๋น๊ต ๊ฐ๋ฅํ ๊ฒ๋ค"์ ์๊ฐํด๋ด์. ์ซ์, ๋ฌธ์, ๋ ์ง ๋ฑ ๋ค์ํ ๊ฒ๋ค์ ์๋ก ๋น๊ตํ ์ ์์ฃ ? Haskell์์๋ ์ด๋ฐ "๋น๊ต ๊ฐ๋ฅํ" ํ์
๋ค์ Eq
ํ์
ํด๋์ค๋ก ๋ฌถ์ด์.
class Eq a where
(==) :: a -> a -> Bool
(/=) :: a -> a -> Bool
์ด ์ฝ๋๊ฐ ์๋ฏธํ๋ ๊ฑด ๋ญ๊น์? "์ด๋ค ํ์
a
๊ฐ Eq
ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋๋ ค๋ฉด, ==
(๊ฐ๋ค)์ /=
(๋ค๋ฅด๋ค) ์ฐ์ฐ์ ์ ์ํด์ผ ํด"๋ผ๋ ๋ป์ด์์.
์ฌ๋ฅ๋ท์ ์๋ก ๋ค์ด๋ณผ๊น์? ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ์ฌ๋ฅ์ ๋น๊ตํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด, ์ด๋ ๊ฒ ํ ์ ์์ด์:
data Talent = Coding | Design | Writing | Music
instance Eq Talent where
Coding == Coding = True
Design == Design = True
Writing == Writing = True
Music == Music = True
_ == _ = False
์ด๋ ๊ฒ ํ๋ฉด ์ด์ ์ฌ๋ฅ๋ค์ ์๋ก ๋น๊ตํ ์ ์๊ฒ ๋๋ ๊ฑฐ์ฃ ! ๐
5.1. ์ฃผ์ ํ์ ํด๋์ค๋ค ๐
Haskell์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ์ฉํ ํ์ ํด๋์ค๋ค์ด ์์ด์. ๋ช ๊ฐ์ง ์ค์ํ ๊ฒ๋ค์ ์ดํด๋ณผ๊น์?
Eq
: ๋๋ฑ์ฑ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ํ์ ๋คOrd
: ์์ ๋น๊ต๊ฐ ๊ฐ๋ฅํ ํ์ ๋คShow
: ๋ฌธ์์ด๋ก ํํ ๊ฐ๋ฅํ ํ์ ๋คRead
: ๋ฌธ์์ด์์ ๊ฐ์ ์ฝ์ด์ฌ ์ ์๋ ํ์ ๋คNum
: ์ซ์์ฒ๋ผ ๋์ํ๋ ํ์ ๋คFunctor
: ํจ์๋ฅผ ์ ์ฉํ ์ ์๋ ํ์ ๋ค
์ด๋ฐ ํ์ ํด๋์ค๋ค์ ์ฌ์ฉํ๋ฉด, ๋ค์ํ ํ์ ๋ค์ ๋ํด ์ผ๊ด๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ ์ ์์ด์. ๋ง์น ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ฌ๋ฅ๋ค์ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ฒ๋ผ์! ๐
6. ํ์ ์์คํ ์ค๊ณ, ์ด๋ป๊ฒ ํ๋ ๊ฑฐ์ผ? ๐๏ธ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ค์ ๋ก ํ์ ์์คํ ์ ์ค๊ณํด๋ณด๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณผ๊น์? ์ด๊ฑด ๋ง์น ๋ ๊ณ ๋ก ๊ฑฐ๋ํ ์ฑ์ ์๋ ๊ฒ๊ณผ ๋น์ทํด์. ์์ ๋ธ๋ก๋ค(๊ธฐ๋ณธ ํ์ ๋ค)์ ์กฐํฉํด์ ๋ฉ์ง ๊ตฌ์กฐ๋ฌผ(๋ณต์กํ ํ์ ์์คํ )์ ๋ง๋๋ ๊ฑฐ์ฃ ! ใ ใ ใ
6.1. ๋ฌธ์ ์ ์ํ๊ธฐ ๐
ํ์ ์์คํ ์ ์ค๊ณํ ๋ ๊ฐ์ฅ ๋จผ์ ํด์ผ ํ ์ผ์ ์ฐ๋ฆฌ๊ฐ ํด๊ฒฐํ๋ ค๋ ๋ฌธ์ ๋ฅผ ๋ช ํํ ์ ์ํ๋ ๊ฑฐ์์. ์๋ฅผ ๋ค์ด, ์ฌ๋ฅ๋ท์์ ์ฌ์ฉ์์ ์ฌ๋ฅ์ ๊ด๋ฆฌํ๋ ์์คํ ์ ๋ง๋ ๋ค๊ณ ์๊ฐํด๋ณผ๊น์?
6.2. ๊ธฐ๋ณธ ํ์ ์ ์ํ๊ธฐ ๐งฑ
๋จผ์ ์ฐ๋ฆฌ ์์คํ ์ ๊ธฐ๋ณธ์ด ๋๋ ํ์ ๋ค์ ์ ์ํด๋ณผ๊ฒ์.
data User = User { userId :: Int, userName :: String, userAge :: Int }
data Talent = Talent { talentId :: Int, talentName :: String, talentCategory :: Category }
data Category = Programming | Design | Writing | Music | Other
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์, ์ฌ๋ฅ, ์นดํ ๊ณ ๋ฆฌ์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ์ ์์ด์.
6.3. ํ์ ํด๋์ค ํ์ฉํ๊ธฐ ๐ง
์ด์ ์ด ํ์ ๋ค์ ๋ํด ๋ช ๊ฐ์ง ์ ์ฉํ ๋์์ ์ ์ํด๋ณผ๊น์?
instance Show User where
show (User id name age) = name ++ " (ID: " ++ show id ++ ", Age: " ++ show age ++ ")"
instance Eq Talent where
(Talent id1 _ _) == (Talent id2 _ _) = id1 == id2
instance Ord Talent where
compare (Talent id1 _ _) (Talent id2 _ _) = compare id1 id2
์ด๋ ๊ฒ ํ๋ฉด ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์์๊ฒ ์ถ๋ ฅํ๊ณ , ์ฌ๋ฅ๋ค์ ID๋ก ๋น๊ตํ๊ณ ์ ๋ ฌํ ์ ์๊ฒ ๋ผ์!
6.4. ํจ์ ํ์ ์ค๊ณํ๊ธฐ ๐๏ธ
์ด์ ์ฐ๋ฆฌ ์์คํ ์์ ์ฌ์ฉํ ๋ช ๊ฐ์ง ํจ์๋ค์ ์ค๊ณํด๋ณผ๊น์?
findUser :: Int -> [User] -> Maybe User
findUser id users = find (\user -> userId user == id) users
addTalent :: User -> Talent -> User
addTalent user talent = -- ๊ตฌํ์ ์๋ต
matchTalents :: User -> [Talent] -> [Talent]
matchTalents user talents = -- ๊ตฌํ์ ์๋ต
์ด๋ฐ ์์ผ๋ก ํจ์๋ค์ ์ค๊ณํ๋ฉด, ์ฌ์ฉ์๋ฅผ ์ฐพ๊ณ , ์ฌ๋ฅ์ ์ถ๊ฐํ๊ณ , ์ฌ์ฉ์์๊ฒ ๋ง๋ ์ฌ๋ฅ์ ์ฐพ๋ ๋ฑ์ ์์ ์ ํ ์ ์์ด์.
6.5. ๋์์ ๋ฐ์ดํฐ ํ์ ํ์ฉํ๊ธฐ ๐งฌ
์ข ๋ ๋ณต์กํ ์ํฉ์ ํํํ๊ธฐ ์ํด ๋์์ ๋ฐ์ดํฐ ํ์ ์ ํ์ฉํด๋ณผ๊น์?
data TalentLevel = Beginner | Intermediate | Expert
data TalentRating = TalentRating {
ratingValue :: Float,
ratingCount :: Int
}
data EnhancedTalent = EnhancedTalent {
basicInfo :: Talent,
level :: TalentLevel,
rating :: TalentRating
}
์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฅ์ ๋ํด ๋ ์์ธํ ์ ๋ณด๋ฅผ ํํํ ์ ์๊ฒ ๋ผ์. ์ฌ๋ฅ์ ๋ ๋ฒจ, ํ์ ๋ฑ์ ํฌํจํ ์ ์์ฃ .
6.6. ํ์ ์์ ์ฑ ํ๋ณดํ๊ธฐ ๐ก๏ธ
Haskell์ ๊ฐ๋ ฅํ ํ์ ์์คํ ์ ํ์ฉํ๋ฉด, ๋ง์ ๋ฒ๊ทธ๋ค์ ์ปดํ์ผ ์์ ์ ์ก์๋ผ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๋์ด์ ์์๊ฐ ๋ค์ด๊ฐ์ง ์๋๋ก ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ ๊ฒ ํ ์ ์์ฃ :
newtype Age = Age { getAge :: Int }
mkAge :: Int -> Maybe Age
mkAge n | n >= 0 && n < 150 = Just (Age n)
| otherwise = Nothing
data SafeUser = SafeUser { safeUserId :: Int, safeUserName :: String, safeUserAge :: Age }
์ด๋ ๊ฒ ํ๋ฉด ์ ํจํ์ง ์์ ๋์ด๋ก ์ฌ์ฉ์๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํด์ ธ์. ์์ ํ ํ๋ก๊ทธ๋๋ฐ์ ์ฒซ๊ฑธ์์ด์ฃ ! ๐
7. Haskell ํ์ ์์คํ ์ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค ๐
์, ์ด์ Haskell ํ์ ์์คํ ์ ์ ๋ง ์ฉ๋ ๊ธฐ๋ฅ๋ค์ ๋ํด ์์๋ณผ ์ฐจ๋ก์์! ์ด ๋ถ๋ถ์ ์ข ์ด๋ ค์ธ ์ ์์ง๋ง, ํ ๋ฒ ๋์ ํด๋ณผ๊น์? ใ ใ ใ
7.1. ๋คํ์ฑ (Polymorphism) ๐ฆ
๋คํ์ฑ์ด๋ ์ฌ๋ฌ ๊ฐ์ง ํ์ ์ ๋ํด ๋์ํ ์ ์๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฅ๋ ฅ์ ๋งํด์ .
๋ง์น ๋ง๋ฅ ์ด์ ์ฒ๋ผ, ๋ค์ํ "๋ฌธ"(ํ์ )์ ์ด ์ ์๋ ๊ฑฐ์ฃ !Haskell์์๋ ์ฃผ๋ก ๋ ๊ฐ์ง ํํ์ ๋คํ์ฑ์ ์ฌ์ฉํด์:
- ๋งค๊ฐ๋ณ์์ ๋คํ์ฑ (Parametric Polymorphism): ํ์ ๋ณ์๋ฅผ ์ฌ์ฉํด ์ฌ๋ฌ ํ์ ์ ๋ํด ๋์ํ๋ ํจ์๋ฅผ ๋ง๋ค์ด์.
- ์ ๋ํน ๋คํ์ฑ (Ad-hoc Polymorphism): ํ์ ํด๋์ค๋ฅผ ํตํด ๋ค์ํ ํ์ ์ ๋ํด ๊ฐ์ ์ด๋ฆ์ ํจ์๋ฅผ ๋ค๋ฅด๊ฒ ๊ตฌํํ ์ ์์ด์.
์๋ฅผ ๋ค์ด๋ณผ๊น์?
-- ๋งค๊ฐ๋ณ์์ ๋คํ์ฑ
identity :: a -> a
identity x = x
-- ์ ๋ํน ๋คํ์ฑ (Eq ํ์
ํด๋์ค ์ฌ์ฉ)
findInList :: Eq a => a -> [a] -> Maybe Int
findInList _ [] = Nothing
findInList x (y:ys)
| x == y = Just 0
| otherwise = fmap (+1) (findInList x ys)
identity
ํจ์๋ ์ด๋ค ํ์
์ ๊ฐ์ด๋ ๋ฐ์์ ๊ทธ๋๋ก ๋ฐํํด์. findInList
ํจ์๋ Eq ํ์
ํด๋์ค์ ์ธ์คํด์ค์ธ ์ด๋ค ํ์
์ ๋ํด์๋ ๋์ํ ์ ์์ด์. ๋ฉ์ง์ฃ ? ๐
7.2. ๊ณ ์ฐจ ํ์ (Higher-Kinded Types) ๐ข
๊ณ ์ฐจ ํ์ ์ ํ์ ์ ์ธ์๋ก ๋ฐ๋ ํ์ ์ ๋งํด์. ์กฐ๊ธ ์ด๋ ค์ธ ์ ์์ง๋ง, ์ ๋ง ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์์!
class Functor f where
fmap :: (a -> b) -> f a -> f b
์ฌ๊ธฐ์ f
๋ ํ์
์ ๋ฐ์์ ์๋ก์ด ํ์
์ ๋ง๋๋ ํ์
์์ฑ์์์. ์๋ฅผ ๋ค์ด, Maybe
๋ ๋ฆฌ์คํธ []
๊ฐ์ ๊ฒ๋ค์ด ์ด์ ํด๋นํด์.
์ด๋ฐ ๊ณ ์ฐจ ํ์ ์ ์ด์ฉํ๋ฉด ์ ๋ง ์ถ์์ ์ด๊ณ ์ฌ์ฌ์ฉ์ฑ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ค์ํ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ์ผ๊ด๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ๋ ์ ์ฉํ๊ฒ ์ฃ ?
7.3. ์ข ์ ํ์ (Dependent Types) ๐
Haskell์ ์์ ํ ์ข ์ ํ์ ์ ์ง์ํ์ง๋ ์์ง๋ง, GHC(Glasgow Haskell Compiler)์ ํ์ฅ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด ๋น์ทํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์์ด์.
{-# LANGUAGE DataKinds, GADTs #-}
data Vec :: Nat -> Type -> Type where
VNil :: Vec 'Zero a
VCons :: a -> Vec n a -> Vec ('Succ n) a
์ด ์ฝ๋๋ ๊ธธ์ด๊ฐ ํ์ ์์ค์์ ์ ํด์ง ๋ฒกํฐ๋ฅผ ์ ์ํด์. ์ด๋ฅผ ํตํด ๋ฒกํฐ์ ๊ธธ์ด์ ๊ด๋ จ๋ ๋ง์ ์ค๋ฅ๋ฅผ ์ปดํ์ผ ์์ ์ ์ก์๋ผ ์ ์์ฃ !
7.4. ํ์ ํจ๋ฐ๋ฆฌ (Type Families) ๐จโ๐ฉโ๐งโ๐ฆ
ํ์ ํจ๋ฐ๋ฆฌ๋ ํ์ ์์ค์ ํจ์๋ผ๊ณ ์๊ฐํ ์ ์์ด์. ํ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ์ ์ ๋ฐํํ๋ ๊ฑฐ์ฃ .
{-# LANGUAGE TypeFamilies #-}
type family Elem a where
Elem [a] = a
Elem (Set a) = a
Elem (Map k v) = v
์ด๋ ๊ฒ ํ๋ฉด ์ปจํ ์ด๋ ํ์ ์ ์์ ํ์ ์ ์ฝ๊ฒ ์ถ์ถํ ์ ์์ด์. ์ฌ๋ฅ๋ท์์ ๋ค์ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ ์ฉํ๊ฒ ์ฃ ?
8. ์ค์ ์์ : ์ฌ๋ฅ๋ท ํ์ ์์คํ ์ค๊ณ ๐ผ
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ชจ๋ ๊ฒ์ ์ข ํฉํด์ ์ฌ๋ฅ๋ท์ ํ์ ์์คํ ์ ์ค๊ณํด๋ณผ๊น์? ์ ๋ง ์ฌ๋ฏธ์์ ๊ฑฐ์์! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ