๐Ÿง  Haskell๋กœ ๋ฐฐ์šฐ๋Š” ํƒ€์ž… ์‹œ์Šคํ…œ ์„ค๊ณ„ ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿง  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์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์€ ์ •์ ์ด๋ฉด์„œ๋„ ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”๋ก  ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”.

์ด๊ฒŒ ๋ฌด์Šจ ๋ง์ด๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”!
  1. ์ •์  ํƒ€์ž… ์‹œ์Šคํ…œ: ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ํƒ€์ž…์„ ๊ฒ€์‚ฌํ•ด์š”. ๋งˆ์น˜ ์š”๋ฆฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ์žฌ๋ฃŒ๊ฐ€ ์ œ๋Œ€๋กœ ์ค€๋น„๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ฃ .
  2. ๊ฐ•๋ ฅํ•œ ํƒ€์ž… ์ถ”๋ก : ์—ฌ๋Ÿฌ๋ถ„์ด ์ผ์ผ์ด ํƒ€์ž…์„ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„, 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, -10
  • Float: ์†Œ์ˆ˜์ ์ด ์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋‚˜ํƒ€๋‚ด์š”. ์˜ˆ: 3.14, -0.01
  • Double: 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 ๊ฐ’์„ ๊ฐ€์ง) ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ •์˜ํ•ด์š”.

์ด๋Ÿฐ ์‹์œผ๋กœ ์—ฌ๋Ÿฌ๋ถ„๋งŒ์˜ ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์žฌ๋Šฅ๋„ท์—์„œ ๋‹ค์–‘ํ•œ ์žฌ๋Šฅ๋“ค์„ ํ‘œํ˜„ํ•  ๋•Œ ์ด๋Ÿฐ ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ํ™œ์šฉํ•˜๋ฉด ์ •๋ง ์œ ์šฉํ•  ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜„

๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž… ์˜ˆ์‹œ: Shape Circle Float Rectangle Float Float Shape

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. ์‹ค์ „ ์˜ˆ์ œ: ์žฌ๋Šฅ๋„ท ํƒ€์ž… ์‹œ์Šคํ…œ ์„ค๊ณ„ ๐Ÿ’ผ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ๋ชจ๋“  ๊ฒƒ์„ ์ข…ํ•ฉํ•ด์„œ ์žฌ๋Šฅ๋„ท์˜ ํƒ€์ž… ์‹œ์Šคํ…œ์„ ์„ค๊ณ„ํ•ด๋ณผ๊นŒ์š”? ์ •๋ง ์žฌ๋ฏธ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜„