๐Ÿง  Haskell์˜ ํด๋“œ์™€ ์–ธํด๋“œ: ์žฌ๊ท€์˜ ์ถ”์ƒํ™” ๐Ÿš€

์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿง  Haskell์˜ ํด๋“œ์™€ ์–ธํด๋“œ: ์žฌ๊ท€์˜ ์ถ”์ƒํ™” ๐Ÿš€

 

 

์•ˆ๋…•ํ•˜์„ธ์š”, ์—ฌ๋Ÿฌ๋ถ„! ์˜ค๋Š˜์€ ์ข€ ํŠน๋ณ„ํ•œ ์ฃผ์ œ๋กœ ์ฐพ์•„์™”์–ด์š”. ๋ฐ”๋กœ Haskell์˜ ํด๋“œ์™€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์–˜๊ธฐํ•ด๋ณผ ๊ฑด๋ฐ์š”. ์–ด, ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด์ฃ ? ใ…‹ใ…‹ใ…‹ ๊ฑฑ์ • ๋งˆ์„ธ์š”! ์ œ๊ฐ€ ์‰ฝ๊ณ  ์žฌ๋ฐŒ๊ฒŒ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”. ๋งˆ์น˜ ์นดํ†ก์œผ๋กœ ์ˆ˜๋‹ค ๋– ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ์š”! ๐Ÿ˜‰

๋จผ์ €, Haskell์ด ๋ญ”์ง€ ๋ชจ๋ฅด๋Š” ๋ถ„๋“ค์„ ์œ„ํ•ด ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, Haskell์€ ์ˆœ์ˆ˜ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ˆ์š”. ๋ญ”๊ฐ€ ๊ณ ๊ธ‰์ง„ ๋Š๋‚Œ ๋‚˜์ฃ ? ใ…Žใ…Ž ๊ทผ๋ฐ ์ง„์งœ ๋งค๋ ฅ์ ์ธ ์–ธ์–ด๋ž๋‹ˆ๋‹ค. ํŠนํžˆ ์˜ค๋Š˜ ๋‹ค๋ฃฐ ํด๋“œ์™€ ์–ธํด๋“œ๋Š” Haskell์˜ ์ง„์งœ ๊ฟ€๊ธฐ๋Šฅ์ด์—์š”!

๐Ÿ’ก TMI: Haskell์ด๋ผ๋Š” ์ด๋ฆ„์€ ์ˆ˜ํ•™์ž์ด์ž ๋…ผ๋ฆฌํ•™์ž์ธ Haskell Brooks Curry์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ ์ง€์–ด์กŒ๋Œ€์š”. ๋ญ”๊ฐ€ ์žˆ์–ด ๋ณด์ด์ฃ ? ใ…‹ใ…‹

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

๊ทธ๋Ÿผ ์ด์ œ๋ถ€ํ„ฐ ํด๋“œ์™€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ํ•˜๋‚˜์”ฉ ์•Œ์•„๋ณผ๊ฒŒ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋ ˆ์ธ ๊ณ ! ๐Ÿš€

๐ŸŒŸ ํด๋“œ(Fold): ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๋Š” ๋งˆ๋ฒ• โœจ

ํด๋“œ, ์˜์–ด๋กœ 'fold'๋Š” '์ ‘๋‹ค'๋ผ๋Š” ๋œป์ด์—์š”. ์ข…์ด์ ‘๊ธฐ ์ƒ๊ฐ๋‚˜์‹œ์ฃ ? ใ…‹ใ…‹ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ์˜ ํด๋“œ๋„ ๋น„์Šทํ•œ ๊ฐœ๋…์ด์—์š”. ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜๋กœ '์ ‘์–ด' ๋‚˜๊ฐ€๋Š” ๊ฑฐ์ฃ .

ํด๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๋‚˜ ํŠธ๋ฆฌ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ์š”์†Œ์— ์–ด๋–ค ์—ฐ์‚ฐ์„ ์ ์šฉํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„์ ํ•ด๋‚˜๊ฐ€๋Š” ํ•จ์ˆ˜์˜ˆ์š”. ๋ญ”๊ฐ€ ์–ด๋ ค์›Œ ๋ณด์ด์ฃ ? ๊ฑฑ์ • ๋งˆ์„ธ์š”, ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”!

๐ŸŽ ์˜ˆ์‹œ: ์‚ฌ๊ณผ ๋ฐ”๊ตฌ๋‹ˆ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด์š”. ์ด ๋ฐ”๊ตฌ๋‹ˆ์— ์‚ฌ๊ณผ๊ฐ€ 5๊ฐœ ์žˆ์–ด์š”. ์šฐ๋ฆฌ๋Š” ์ด ์‚ฌ๊ณผ๋“ค์˜ ์ด ๋ฌด๊ฒŒ๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด์š”. ์–ด๋–ป๊ฒŒ ํ• ๊นŒ์š”?

  1. ์ฒซ ๋ฒˆ์งธ ์‚ฌ๊ณผ์˜ ๋ฌด๊ฒŒ๋ฅผ ์žฐ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ์‚ฌ๊ณผ์˜ ๋ฌด๊ฒŒ๋ฅผ ์žฌ๊ณ  ์ฒซ ๋ฒˆ์งธ ์‚ฌ๊ณผ ๋ฌด๊ฒŒ์™€ ๋”ํ•œ๋‹ค.
  3. ์„ธ ๋ฒˆ์งธ ์‚ฌ๊ณผ์˜ ๋ฌด๊ฒŒ๋ฅผ ์žฌ๊ณ  ์ง€๊ธˆ๊นŒ์ง€์˜ ์ด ๋ฌด๊ฒŒ์— ๋”ํ•œ๋‹ค.
  4. ์ด๋ ‡๊ฒŒ ๊ณ„์†ํ•ด์„œ ๋งˆ์ง€๋ง‰ ์‚ฌ๊ณผ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

์ด๊ฒŒ ๋ฐ”๋กœ ํด๋“œ์˜ˆ์š”! ์‚ฌ๊ณผ๋“ค(๋ฐ์ดํ„ฐ)์„ ํ•˜๋‚˜์”ฉ '์ ‘์–ด' ๋‚˜๊ฐ€๋ฉด์„œ ์ด ๋ฌด๊ฒŒ(๊ฒฐ๊ณผ)๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๊ฑฐ์ฃ .

Haskell์—์„œ๋Š” ์ด๋Ÿฐ ํด๋“œ ์—ฐ์‚ฐ์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ํด๋“œ ํ•จ์ˆ˜๋Š” ๋‘ ๊ฐ€์ง€์˜ˆ์š”:

  • foldr: ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์ ‘๋Š” ํ•จ์ˆ˜
  • foldl: ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ ‘๋Š” ํ•จ์ˆ˜

์ด ๋‘ ํ•จ์ˆ˜์˜ ์ฐจ์ด์ ์€ ๋‚˜์ค‘์— ์ž์„ธํžˆ ์„ค๋ช…ํ• ๊ฒŒ์š”. ์ผ๋‹จ์€ ๋‘˜ ๋‹ค ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ‘๋Š”๋‹ค๋Š” ์ ๋งŒ ๊ธฐ์–ตํ•˜์„ธ์š”!

์ž, ์ด์ œ Haskell ์ฝ”๋“œ๋กœ ํด๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณผ๊นŒ์š”?

-- ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜
sumList :: [Int] -> Int
sumList = foldr (+) 0

-- ์‚ฌ์šฉ ์˜ˆ
main = do
    let numbers = [1, 2, 3, 4, 5]
    print $ sumList numbers  -- ๊ฒฐ๊ณผ: 15

์šฐ์™€, ๋ญ”๊ฐ€ ์žˆ์–ด ๋ณด์ด์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๊ฐ„๋‹จํ•ด์š”. sumList ํ•จ์ˆ˜๋Š” ์ •์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋”ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์š”. foldr์„ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌ์ŠคํŠธ์˜ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ์™ผ์ชฝ์œผ๋กœ ๋”ํ•ด๋‚˜๊ฐ€๋Š” ๊ฑฐ์ฃ .

ํด๋“œ์˜ ์ง„์งœ ๋งค๋ ฅ์€ ๋ญ˜๊นŒ์š”? ๋ฐ”๋กœ ์žฌ์‚ฌ์šฉ์„ฑ์ด์—์š”! ์œ„์˜ sumList ํ•จ์ˆ˜์—์„œ (+) ๋Œ€์‹  ๋‹ค๋ฅธ ์—ฐ์‚ฐ์„ ๋„ฃ์œผ๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ผ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:

-- ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ณฑํ•˜๋Š” ํ•จ์ˆ˜
productList :: [Int] -> Int
productList = foldr (*) 1

-- ๋ฆฌ์ŠคํŠธ์˜ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๋Š” ํ•จ์ˆ˜
maxList :: [Int] -> Int
maxList = foldr max (minBound :: Int)

์–ด๋•Œ์š”? ๊ฐ™์€ foldr์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์ด ๋งŒ๋“ค์–ด์กŒ์ฃ ? ์ด๊ฒŒ ๋ฐ”๋กœ ํด๋“œ์˜ ํž˜์ด์—์š”! ๐Ÿ˜Ž

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐ˜๋ณต๋ฌธ์„ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ ๋„ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํด๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ต์ง€ ์•Š์ฃ ? ใ…Žใ…Ž ์ด์ œ ํด๋“œ์˜ ๊ฐœ๋…์„ ์ดํ•ดํ–ˆ์œผ๋‹ˆ, ๋‹ค์Œ์€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ฐจ๋ก€์˜ˆ์š”. ๊ทผ๋ฐ ๊ทธ์ „์— ์ž ๊น! ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)์—์„œ๋Š” ์ด๋Ÿฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ  ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๊ธฐํšŒ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฑฐ ์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”? ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๊ด€์‹ฌ ์žˆ์œผ์‹  ๋ถ„๋“ค์€ ํ•œ ๋ฒˆ ๋“ค๋Ÿฌ๋ณด์„ธ์š”! ๐Ÿ‘€

์ž, ์ด์ œ ์–ธํด๋“œ๋กœ ๋„˜์–ด๊ฐˆ๊ฒŒ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ! ๐Ÿš€

๐ŸŽญ ์–ธํด๋“œ(Unfold): ๋ฐ์ดํ„ฐ๋ฅผ ํŽผ์น˜๋Š” ๋งˆ๋ฒ• ๐ŸŒˆ

์ž, ์ด์ œ ์šฐ๋ฆฌ์˜ ์ฃผ์ธ๊ณต ์–ธํด๋“œ(Unfold)๋ฅผ ์†Œ๊ฐœํ•  ์‹œ๊ฐ„์ด์—์š”! ์–ธํด๋“œ๋Š” ํด๋“œ์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋…์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ผ์š”. ํด๋“œ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ '์ ‘๋Š”' ๊ฑฐ๋ผ๋ฉด, ์–ธํด๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ 'ํŽผ์น˜๋Š”' ๊ฑฐ์˜ˆ์š”. ๋ญ”๊ฐ€ ๋ฉ‹์ง„ ๋Š๋‚Œ ๋‚˜์ฃ ? ใ…‹ใ…‹ใ…‹

์–ธํด๋“œ๋Š” ์–ด๋–ค ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•ด๋‚˜๊ฐ€๋Š” ํ•จ์ˆ˜์˜ˆ์š”. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, ๋ฌด์—์„œ ์œ ๋ฅผ ์ฐฝ์กฐํ•˜๋Š” ๊ฑฐ์ฃ ! (์™€์šฐ, ๋ญ”๊ฐ€ ์ฒ ํ•™์ ์ธ๋ฐ์š”? ใ…Žใ…Ž)

๐ŸŒฑ ์˜ˆ์‹œ: ์”จ์•—์„ ์‹ฌ๊ณ  ๋‚˜๋ฌด๋ฅผ ํ‚ค์šฐ๋Š” ๊ณผ์ •์„ ์ƒ๊ฐํ•ด๋ณด์„ธ์š”. ์ฒ˜์Œ์—๋Š” ์ž‘์€ ์”จ์•— ํ•˜๋‚˜๋กœ ์‹œ์ž‘ํ•˜์ง€๋งŒ, ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ๋ฟŒ๋ฆฌ, ์ค„๊ธฐ, ์žŽ, ๊ฐ€์ง€๊ฐ€ ์ž๋ผ๋‚˜์ฃ . ์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ์ž‘์€ ์‹œ์ž‘์ ์—์„œ ๋ณต์žกํ•œ ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ณผ์ •, ๊ทธ๊ฒŒ ๋ฐ”๋กœ ์–ธํด๋“œ์˜ˆ์š”!

Haskell์—์„œ ์–ธํด๋“œ๋Š” ์ฃผ๋กœ unfoldr ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์š”. ์ด ํ•จ์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”:

unfoldr :: (b -> Maybe (a, b)) -> b -> [a]

์–ด... ๋ญ”๊ฐ€ ๋ณต์žกํ•ด ๋ณด์ด์ฃ ? ใ…‹ใ…‹ ๊ฑฑ์ • ๋งˆ์„ธ์š”, ํ•˜๋‚˜์”ฉ ๋œฏ์–ด๋ณผ๊ฒŒ์š”!

  • b: ์ดˆ๊ธฐ ์ƒํƒœ (์šฐ๋ฆฌ์˜ ์”จ์•— ๊ฐ™์€ ๊ฑฐ์˜ˆ์š”)
  • a: ์ƒ์„ฑ๋  ๋ฆฌ์ŠคํŠธ์˜ ์š”์†Œ ํƒ€์ž…
  • Maybe (a, b): ํ˜„์žฌ ์ƒํƒœ์—์„œ ์ƒ์„ฑํ•  ์š”์†Œ์™€ ๋‹ค์Œ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด์š”. Nothing์ด๋ฉด ์ƒ์„ฑ ์ข…๋ฃŒ!

์ž, ์ด์ œ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋ณผ๊นŒ์š”?

-- 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ง์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜
evenNumbers :: [Integer]
evenNumbers = unfoldr (\n -> Just (n, n+2)) 0

-- ์‚ฌ์šฉ ์˜ˆ
main = do
    print $ take 5 evenNumbers  -- ๊ฒฐ๊ณผ: [0,2,4,6,8]

์šฐ์™€! ๋ญ”๊ฐ€ ๋Œ€๋‹จํ•ด ๋ณด์ด์ฃ ? ใ…‹ใ…‹ใ…‹ ์ด ์ฝ”๋“œ๊ฐ€ ํ•˜๋Š” ์ผ์€ ๊ฐ„๋‹จํ•ด์š”. 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ 2์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ์ง์ˆ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์š”. unfoldr ํ•จ์ˆ˜๋Š” ๊ณ„์†ํ•ด์„œ ๋‹ค์Œ ์ง์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์šฐ๋ฆฌ๋Š” take 5๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์•ž์˜ 5๊ฐœ๋งŒ ๊ฐ€์ ธ์˜จ ๊ฑฐ์˜ˆ์š”.

์–ธํด๋“œ์˜ ์ง„์งœ ๋งค๋ ฅ์€ ๋ฌดํ•œํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ์˜ˆ์š”! Haskell์€ ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€(lazy evaluation)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹ค์ œ๋กœ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๊ณ„์‚ฐํ•ด์š”. ์ฆ‰, ์œ„์˜ evenNumbers๋Š” ์ด๋ก ์ƒ ๋ฌดํ•œํ•œ ์ง์ˆ˜ ๋ฆฌ์ŠคํŠธ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ 5๊ฐœ๋งŒ ์š”์ฒญํ–ˆ์œผ๋‹ˆ 5๊ฐœ๋งŒ ๊ณ„์‚ฐํ•œ ๊ฑฐ์ฃ . ์‹ ๊ธฐํ•˜์ง€ ์•Š๋‚˜์š”? ๐Ÿ˜ฎ

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ„๋‹จํ•œ ๊ทœ์น™์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Š” ํŠนํžˆ ๋ฌดํ•œํ•œ ์‹œํ€€์Šค๋‚˜ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”? ํด๋“œ๋ž‘ ๋น„๊ตํ•˜๋ฉด ์–ด๋–ค ๋Š๋‚Œ์ธ๊ฐ€์š”? ใ…Žใ…Ž ๋‘˜ ๋‹ค ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ์„œ๋กœ ๋ฐ˜๋Œ€๋˜๋Š” ๊ฐœ๋…์ด๋ผ๋Š” ๊ฒŒ ์žฌ๋ฐŒ์ฃ ?

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์ด๋Ÿฐ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šฐ๋‹ค ๋ณด๋ฉด ๋•Œ๋ก  ํ˜ผ์ž ๊ณ ๋ฏผํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)๊ฐ™์€ ํ”Œ๋žซํผ์ด ์ •๋ง ์œ ์šฉํ•˜๋”๋ผ๊ณ ์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ , ์„œ๋กœ์˜ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•œ๋ฒˆ ์ฐธ์—ฌํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์•Œ์•„๋ดค์–ด์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์—์š”! ์ด ๋‘ ๊ฐœ๋…์„ ์–ด๋–ป๊ฒŒ ์‹ค์ œ๋กœ ํ™œ์šฉํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์™œ ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋‹ค์Œ ์„น์…˜์œผ๋กœ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ” ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์‹ค์ œ ํ™œ์šฉ: ์ฝ”๋“œ๋กœ ๋ณด๋Š” ๋งˆ๋ฒ• โœจ

์ž, ์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ๋ฐฐ์šด ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๋Š”์ง€ ๋ณผ ์ฐจ๋ก€์˜ˆ์š”! ๋ญ”๊ฐ€ ๋‘๊ทผ๋‘๊ทผํ•˜์ง€ ์•Š๋‚˜์š”? ใ…‹ใ…‹ใ…‹ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด์„œ ์ด ๊ฐœ๋…๋“ค์ด ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•œ์ง€ ์ง์ ‘ ์ฒดํ—˜ํ•ด๋ด์š”!

1. ํด๋“œ(Fold) ํ™œ์šฉํ•˜๊ธฐ ๐ŸŒŸ

๋จผ์ € ํด๋“œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”. ํด๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์–ด๋–ค ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐ ์ •๋ง ์œ ์šฉํ•ด์š”. ๋ช‡ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์‚ดํŽด๋ณผ๊นŒ์š”?

-- ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ์˜ ๊ณฑ์„ ๊ณ„์‚ฐํ•˜๋Š” ํ•จ์ˆ˜
productList :: [Int] -> Int
productList = foldr (*) 1

-- ๋ฆฌ์ŠคํŠธ์—์„œ ์ง์ˆ˜๋งŒ ํ•„ํ„ฐ๋งํ•˜๋Š” ํ•จ์ˆ˜
evenOnly :: [Int] -> [Int]
evenOnly = foldr (\x acc -> if even x then x:acc else acc) []

-- ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘๋Š” ํ•จ์ˆ˜
reverseList :: [a] -> [a]
reverseList = foldl (flip (:)) []

main = do
    let numbers = [1..5]
    putStrLn $ "Product of " ++ show numbers ++ ": " ++ show (productList numbers)
    putStrLn $ "Even numbers in " ++ show numbers ++ ": " ++ show (evenOnly numbers)
    putStrLn $ "Reversed " ++ show numbers ++ ": " ++ show (reverseList numbers)

์šฐ์™€! ๋ญ”๊ฐ€ ๋Œ€๋‹จํ•ด ๋ณด์ด์ฃ ? ใ…‹ใ…‹ใ…‹ ํ•˜๋‚˜์”ฉ ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • productList: ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๊ณฑํ•ด์š”. foldr์„ ์‚ฌ์šฉํ•ด์„œ ์˜ค๋ฅธ์ชฝ๋ถ€ํ„ฐ ๊ณฑ์…ˆ์„ ์ˆ˜ํ–‰ํ•ด์š”.
  • evenOnly: ์ง์ˆ˜๋งŒ ์„ ํƒํ•ด์š”. ํ˜„์žฌ ์š”์†Œ๊ฐ€ ์ง์ˆ˜๋ฉด ๊ฒฐ๊ณผ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•˜๊ณ , ํ™€์ˆ˜๋ฉด ๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€์š”.
  • reverseList: ๋ฆฌ์ŠคํŠธ๋ฅผ ๋’ค์ง‘์–ด์š”. foldl์„ ์‚ฌ์šฉํ•ด์„œ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ƒˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€์š”.

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

2. ์–ธํด๋“œ(Unfold) ํ™œ์šฉํ•˜๊ธฐ ๐ŸŒˆ

์ด์ œ ์–ธํด๋“œ๋ฅผ ํ™œ์šฉํ•œ ์˜ˆ์ œ๋ฅผ ๋ณผ๊นŒ์š”? ์–ธํด๋“œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ผ์š”. ํŠนํžˆ ๋ฌดํ•œํ•œ ์‹œํ€€์Šค๋ฅผ ๋งŒ๋“ค ๋•Œ ์ •๋ง ์œ ์šฉํ•˜๋‹ต๋‹ˆ๋‹ค!

import Data.List (unfoldr)

-- ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
fibonacci :: [Integer]
fibonacci = unfoldr (\(a,b) -> Just (a,(b,a+b))) (0,1)

-- ์ฃผ์–ด์ง„ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  ์ œ๊ณฑ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
squaresUnder :: Integer -> [Integer]
squaresUnder n = unfoldr (\x -> if x*x < n then Just (x*x, x+1) else Nothing) 1

main = do
    putStrLn $ "First 10 Fibonacci numbers: " ++ show (take 10 fibonacci)
    putStrLn $ "Squares under 100: " ++ show (squaresUnder 100)

์˜ค์˜ค! ์ด๊ฒƒ๋„ ๋ฉ‹์ง€์ฃ ? ใ…Žใ…Ž ์„ค๋ช…ํ•ด๋“œ๋ฆด๊ฒŒ์š”:

  • fibonacci: ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด์„ ์ƒ์„ฑํ•ด์š”. ๊ฐ ๋‹จ๊ณ„์—์„œ ํ˜„์žฌ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋‹ค์Œ ๋‘ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•ด์š”.
  • squaresUnder: ์ฃผ์–ด์ง„ ์ˆ˜๋ณด๋‹ค ์ž‘์€ ๋ชจ๋“  ์ œ๊ณฑ์ˆ˜๋ฅผ ์ƒ์„ฑํ•ด์š”. ์ œ๊ณฑ์ˆ˜๊ฐ€ n๋ณด๋‹ค ์ž‘์„ ๋•Œ๊นŒ์ง€๋งŒ ๊ณ„์† ์ƒ์„ฑํ•˜๊ณ , ๊ทธ ์ดํ›„์—” ์ข…๋ฃŒํ•ด์š”.

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

๐Ÿ’ก ๊ฟ€ํŒ: ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•˜๋ฉด ๋”์šฑ ๊ฐ•๋ ฅํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ์–ธํด๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํด๋“œ๋กœ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹์œผ๋กœ์š”!

์–ด๋•Œ์š”? ํด๋“œ์™€ ์–ธํด๋“œ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ณด๋‹ˆ๊นŒ ๋” ์ดํ•ด๊ฐ€ ์ž˜ ๋˜์‹œ๋‚˜์š”? ใ…Žใ…Ž ์ด๋Ÿฐ ๊ณ ๊ธ‰ ๊ธฐ๋ฒ•๋“ค์„ ์ตํžˆ๋ฉด ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ์šฐ์•„ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ์„ฑ๋Šฅ๋ฉด์—์„œ๋„ ์ด์ ์ด ์žˆ๋‹ต๋‹ˆ๋‹ค!

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์ด๋Ÿฐ ๊ณ ๊ธ‰ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šฐ๋‹ค ๋ณด๋ฉด ๋•Œ๋กœ๋Š” ํ˜ผ์ž์„œ ๊ณ ๋ฏผํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net) ๊ฐ™์€ ํ”Œ๋žซํผ์ด ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ , ์„œ๋กœ์˜ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•œ๋ฒˆ ์ฐธ์—ฌํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์‹ค์ œ ํ™œ์šฉ ์‚ฌ๋ก€๋ฅผ ๋ดค์–ด์š”. ๊ทผ๋ฐ ์ด๊ฒŒ ๋‹ค๊ฐ€ ์•„๋‹ˆ์—์š”! ์ด ๊ฐœ๋…๋“ค์ด ์™œ ๊ทธ๋ ‡๊ฒŒ ์ค‘์š”ํ•œ์ง€, ๊ทธ๋ฆฌ๊ณ  ์–ด๋–ค ์žฅ๋‹จ์ ์ด ์žˆ๋Š”์ง€ ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๋‹ค์Œ ์„น์…˜์œผ๋กœ ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿค” ํด๋“œ์™€ ์–ธํด๋“œ: ์™œ ์ค‘์š”ํ• ๊นŒ? ๐Ÿง

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ๊ฐ€ ๋ญ”์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์•Œ์•„๋ดค์–ด์š”. ๊ทผ๋ฐ ๊ถ๊ธˆํ•˜์ง€ ์•Š๋‚˜์š”? ์™œ ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ ๊ฑธ๊นŒ์š”? ์™œ ํ”„๋กœ๊ทธ๋ž˜๋จธ๋“ค์ด ์ด๋Ÿฐ ๊ฐœ๋…์— ์—ด๊ด‘ํ•˜๋Š” ๊ฑธ๊นŒ์š”? ใ…‹ใ…‹ใ…‹ ํ•œ๋ฒˆ ์ž์„ธํžˆ ์•Œ์•„๋ณผ๊นŒ์š”?

1. ์ถ”์ƒํ™”์˜ ํž˜ ๐Ÿ’ช

ํด๋“œ์™€ ์–ธํด๋“œ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ '์ถ”์ƒํ™”'์˜ˆ์š”. ์ถ”์ƒํ™”๊ฐ€ ๋ญ๋ƒ๊ณ ์š”? ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋ณต์žกํ•œ ๊ฑธ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฑฐ์˜ˆ์š”!

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊ฒŒ์š”. ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋”ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ด์š”. ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ๋  ๊ฑฐ์˜ˆ์š”:

sumList :: [Int] -> Int
sumList [] = 0
sumList (x:xs) = x + sumList xs

์Œ... ๋‚˜์˜์ง€ ์•Š์ฃ ? ๊ทผ๋ฐ ์ด๊ฑธ ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

sumList :: [Int] -> Int
sumList = foldr (+) 0

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

2. ์žฌ์‚ฌ์šฉ์„ฑ ๊ทน๋Œ€ํ™” ๐Ÿ”„

ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์ด ์—„์ฒญ๋‚˜๊ฒŒ ๋†’์•„์ ธ์š”. ์–ด๋–ป๊ฒŒ์š”? ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์—์š”!

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๊นŒ ๋ณธ sumList ํ•จ์ˆ˜์—์„œ (+) ๋Œ€์‹  ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์œผ๋ฉด ์™„์ „ํžˆ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ผ์š”:

productList = foldr (*) 1
maxList = foldr max (minBound :: Int)

์ด๋ ‡๊ฒŒ ํ•˜๋‚˜์˜ ํด๋“œ ํ•จ์ˆ˜๋กœ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ •๋ง ํšจ์œจ์ ์ด์ง€ ์•Š๋‚˜์š”?

3. ๋ฌดํ•œํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ๋‹ค๋ฃจ๊ธฐ ๐ŸŒ 

์–ธํด๋“œ์˜ ๊ฒฝ์šฐ, ๋ฌดํ•œํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒŒ ์ •๋ง ํฐ ์žฅ์ ์ด์—์š”. Haskell์˜ ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€(lazy evaluation) ๋•๋ถ„์— ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๊นŒ ๋ณธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜์—ด ์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ๊ธฐ์–ตํ•˜์„ธ์š”?

fibonacci = unfoldr (\(a,b) -> Just (a,(b,a+b))) (0,1)

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

4. ์„ฑ๋Šฅ ์ตœ์ ํ™” ๐Ÿš€

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

์˜ˆ๋ฅผ ๋“ค์–ด, foldr์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด๋Ÿฐ ์‹์œผ๋กœ์š”:

sumAndLength :: [Int] -> (Int, Int)
sumAndLength = foldr (\x (sum, len) -> (sum + x, len + 1)) (0, 0)

์ด ํ•จ์ˆ˜๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ๊ณผ ๊ธธ์ด๋ฅผ ๋™์‹œ์— ๊ณ„์‚ฐํ•ด์š”. ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์ˆœํšŒํ•˜๋ฉด ๋˜๋‹ˆ๊นŒ ํšจ์œจ์ ์ด์ฃ !

5. ์ˆ˜ํ•™์  ๊ธฐ๋ฐ˜ ๐Ÿงฎ

ํด๋“œ์™€ ์–ธํด๋“œ๋Š” ์ˆ˜ํ•™์ ์œผ๋กœ ํƒ„ํƒ„ํ•œ ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ํŠนํžˆ ์นดํ…Œ๊ณ ๋ฆฌ ์ด๋ก ์ด๋ผ๋Š” ์ˆ˜ํ•™ ๋ถ„์•ผ์™€ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์ฃ . ์ด๋Ÿฐ ์ˆ˜ํ•™์  ๊ธฐ๋ฐ˜ ๋•๋ถ„์— ํ”„๋กœ๊ทธ๋žจ์˜ ์ •ํ™•์„ฑ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์‰ฌ์›Œ์ ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋“œ์™€ ์–ธํด๋“œ ์‚ฌ์ด์—๋Š” '์œตํ•ฉ ๋ฒ•์น™'์ด๋ผ๋Š” ๊ฒŒ ์žˆ์–ด์š”. ์ด ๋ฒ•์น™์„ ์ด์šฉํ•˜๋ฉด ํ”„๋กœ๊ทธ๋žจ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค!

๐ŸŽ“ ํ•™์Šต ํฌ์ธํŠธ: ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์ˆ˜ํ•™์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•˜๋ฉด, ๋” ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋„ˆ๋ฌด ๊นŠ์ด ํŒŒ๊ณ ๋“ค ํ•„์š”๋Š” ์—†์–ด์š”. ๊ธฐ๋ณธ ๊ฐœ๋…์„ ์ตํžˆ๊ณ  ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•ด๋ณด๋ฉด์„œ ์กฐ๊ธˆ์”ฉ ๊นŠ์ด ์žˆ๊ฒŒ ๊ณต๋ถ€ํ•ด๋‚˜๊ฐ€๋Š” ๊ฒŒ ์ข‹๋‹ต๋‹ˆ๋‹ค!

6. ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๏ฟฝๆ ธ

ํด๋“œ์™€ ์–ธํด๋“œ๋Š” ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ ๊ฐœ๋… ์ค‘ ํ•˜๋‚˜์˜ˆ์š”. ์ด ๊ฐœ๋…๋“ค์„ ์ดํ•ดํ•˜๊ณ  ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…๋“ค๋„ ์‰ฝ๊ฒŒ ์ตํž ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋‚˜๋“œ(Monad)๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ดํ‹ฐ๋ธŒ ํŽ‘ํ„ฐ(Applicative Functor) ๊ฐ™์€ ๊ณ ๊ธ‰ ๊ฐœ๋…๋“ค๋„ ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์•„์ด๋””์–ด๋ฅผ ํ™•์žฅํ•œ ๊ฑฐ๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์–ด์š”.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํด๋“œ์™€ ์–ธํด๋“œ๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€ ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ด์ œ ์ข€ ๊ฐ์ด ์˜ค๋‚˜์š”? ใ…Žใ…Ž

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์ด๋ ‡๊ฒŒ ์ค‘์š”ํ•œ ๊ฐœ๋…๋“ค์„ ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋ฉด ๋•Œ๋กœ๋Š” ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net) ๊ฐ™์€ ํ”Œ๋žซํผ์ด ์ •๋ง ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ , ์„œ๋กœ์˜ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•œ๋ฒˆ ์ฐธ์—ฌํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์—๋Š” ์žฅ๋‹จ์ ์ด ์žˆ์ฃ . ๋‹ค์Œ ์„น์…˜์—์„œ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ๊ฑฐ์˜ˆ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ‘๐Ÿ‘Ž ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์žฅ๋‹จ์ : ์–‘๋‚ ์˜ ๊ฒ€ โš”๏ธ

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์šฉํ•œ์ง€ ์•Œ๊ฒŒ ๋์–ด์š”. ํ•˜์ง€๋งŒ ์„ธ์ƒ์— ์™„๋ฒฝํ•œ ๊ฑด ์—†์ฃ ? ใ…‹ใ…‹ใ…‹ ํด๋“œ์™€ ์–ธํด๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜ˆ์š”. ์žฅ์ ๋„ ์žˆ์ง€๋งŒ ๋‹จ์ ๋„ ์žˆ์–ด์š”. ํ•œ๋ฒˆ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ๊นŒ์š”?

๐Ÿ‘ ์žฅ์ 

  1. ์ฝ”๋“œ ๊ฐ„๊ฒฐ์„ฑ: ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ณต์žกํ•œ ๋กœ์ง์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ sum = foldr (+) 0 ์ด๋ ‡๊ฒŒ ํ•œ ์ค„๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์ฃ !
  2. ์žฌ์‚ฌ์šฉ์„ฑ: ํ•˜๋‚˜์˜ ํด๋“œ๋‚˜ ์–ธํด๋“œ ํ•จ์ˆ˜๋กœ ๋‹ค์–‘ํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์š”. ํ•จ์ˆ˜๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌํ•˜๋Š” ํŠน์„ฑ ๋•๋ถ„์ด์ฃ .
  3. ์ถ”์ƒํ™”: ๋ณต์žกํ•œ ์žฌ๊ท€ ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•ด์„œ ๋” ๋†’์€ ์ˆ˜์ค€์—์„œ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค˜์š”.
  4. ์„ฑ๋Šฅ ์ตœ์ ํ™”: ํŠนํžˆ ํด๋“œ์˜ ๊ฒฝ์šฐ, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ตœ์ ํ™”ํ•˜๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ์–ด ์„ฑ๋Šฅ์ด ์ข‹์„ ์ˆ˜ ์žˆ์–ด์š”.
  5. ๋ฌดํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ: ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌดํ•œํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ‘Ž ๋‹จ์ 

  1. ํ•™์Šต ๊ณก์„ : ์ฒ˜์Œ ์ ‘ํ•˜๋ฉด ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ต์ˆ™ํ•˜์ง€ ์•Š์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š” ๋”์šฑ ๊ทธ๋ž˜์š”.
  2. ๊ฐ€๋…์„ฑ ๋ฌธ์ œ: ๋„ˆ๋ฌด ๋ณต์žกํ•œ ์—ฐ์‚ฐ์„ ํด๋“œ๋‚˜ ์–ธํด๋“œ๋กœ ํ‘œํ˜„ํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์–ด์š”.
  3. ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€: ํด๋“œ๋‚˜ ์–ธํด๋“œ๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋Š” ๋‹จ๊ณ„๋ณ„๋กœ ์‹คํ–‰ ๊ณผ์ •์„ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”.
  4. ์„ฑ๋Šฅ ์ด์Šˆ: ์ž˜๋ชป ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ด์š”.
  5. ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง: ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ์— ํด๋“œ๋‚˜ ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์˜คํžˆ๋ ค ์ฝ”๋“œ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ’ก ์ฃผ์˜์‚ฌํ•ญ: ํด๋“œ์™€ ์–ธํด๋“œ๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ์ง€๋งŒ, ๋ชจ๋“  ์ƒํ™ฉ์— ์ ํ•ฉํ•œ ๊ฑด ์•„๋‹ˆ์—์š”. ๋ฌธ์ œ์˜ ํŠน์„ฑ๊ณผ ํŒ€์˜ ์—ญ๋Ÿ‰์„ ๊ณ ๋ คํ•ด์„œ ์ ์ ˆํžˆ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์š”!

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

์˜ˆ๋ฅผ ๋“ค์–ด๋ณผ๊นŒ์š”? ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ 2๋ฐฐ๋กœ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•ด๋ด์š”. ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ฃ :

doubleList = foldr (\x acc -> (2*x):acc) []

๊ฐ„๋‹จํ•˜๊ณ  ๋ฉ‹์ง€์ฃ ? ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ƒฅ map ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋” ๋ช…ํ™•ํ•  ์ˆ˜ ์žˆ์–ด์š”:

doubleList = map (*2)

์ด๋ ‡๊ฒŒ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋„๊ตฌ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”.

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜! ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ํŒ€์›๋“ค์˜ ์ดํ•ด๋„๋„ ๊ณ ๋ คํ•ด์•ผ ํ•ด์š”. ๋ชจ๋“  ํŒ€์›์ด ์ด ๊ฐœ๋…์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๋ฉด, ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋•Œ ์–ด๋ ค์›€์„ ๊ฒช์„ ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”.

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ด์ œ ์ข€ ๋” ๊ท ํ˜• ์žกํžŒ ์‹œ๊ฐ์œผ๋กœ ์ด ๊ฐœ๋…๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋์ฃ ? ใ…Žใ…Ž

๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์—์š”, ์ด๋ ‡๊ฒŒ ๋ณต์žกํ•œ ๊ฐœ๋…๋“ค์„ ๋ฐฐ์šฐ๋‹ค ๋ณด๋ฉด ๋•Œ๋กœ๋Š” ํ˜ผ์ž์„œ ๊ณ ๋ฏผํ•˜๊ธฐ ์–ด๋ ค์šด ๋ถ€๋ถ„๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋Ÿด ๋•Œ ์žฌ๋Šฅ๋„ท(https://www.jaenung.net) ๊ฐ™์€ ํ”Œ๋žซํผ์ด ์ •๋ง ์œ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ , ์„œ๋กœ์˜ ๊ฒฝํ—˜์„ ๋‚˜๋ˆ„๋ฉด์„œ ํ•จ๊ป˜ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๊ฑฐ๋“ ์š”. ์—ฌ๋Ÿฌ๋ถ„๋„ ํ•œ๋ฒˆ ์ฐธ์—ฌํ•ด๋ณด๋Š” ๊ฑด ์–ด๋–จ๊นŒ์š”? ๐Ÿ˜Š

์ž, ์ด์ œ ์šฐ๋ฆฌ๋Š” ํด๋“œ์™€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์ด ์•Œ์•„๋ดค์–ด์š”. ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ํ™œ์šฉ, ์ค‘์š”์„ฑ, ๊ทธ๋ฆฌ๊ณ  ์žฅ๋‹จ์ ๊นŒ์ง€! ์–ด๋– ์„ธ์š”? ์ด์ œ ํด๋“œ์™€ ์–ธํด๋“œ๊ฐ€ ์ข€ ๋” ์นœ๊ทผํ•˜๊ฒŒ ๋Š๊ปด์ง€๋‚˜์š”? ใ…Žใ…Ž

๋งˆ์ง€๋ง‰์œผ๋กœ, ์ด ๊ฐœ๋…๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•˜๊ณ  ์—ฐ์Šตํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ํŒ์„ ๋“œ๋ฆฌ๊ณ  ๋งˆ๋ฌด๋ฆฌํ• ๊ฒŒ์š”. ์ค€๋น„๋˜์…จ๋‚˜์š”? ๊ณ ๊ณ ! ๐Ÿš€

๐Ÿ‹๏ธโ€โ™€๏ธ ํด๋“œ์™€ ์–ธํด๋“œ ๋งˆ์Šคํ„ฐํ•˜๊ธฐ: ์‹ค์ „ ํŒ๊ณผ ์—ฐ์Šต ๋ฐฉ๋ฒ• ๐Ÿ’ช

์ž, ์ด์ œ ํด๋“œ์™€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์ด ์•Œ๊ฒŒ ๋์–ด์š”. ๊ทผ๋ฐ ์•Œ๊ธฐ๋งŒ ํ•˜๊ณ  ๋ชป ์“ฐ๋ฉด ๋ฌด์Šจ ์†Œ์šฉ์ด๊ฒ ์–ด์š”? ใ…‹ใ…‹ใ…‹ ์ด์ œ ์ด ๊ฐœ๋…๋“ค์„ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ์Šตํ•˜๊ณ  ์ ์šฉํ•  ์ˆ˜ ์žˆ์„์ง€ ์•Œ์•„๋ณผ๊นŒ์š”?

1. ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๐Ÿฃ

ํด๋“œ์™€ ์–ธํด๋“œ๋Š” ์ฒ˜์Œ์—๋Š” ์ข€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์ž‘์€ ๋ฌธ์ œ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒŒ ์ข‹์•„์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋“ค๋กœ ์‹œ์ž‘ํ•ด๋ณด์„ธ์š”:

  • ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ์˜ ํ•ฉ ๊ตฌํ•˜๊ธฐ
  • ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ€์žฅ ํฐ ๊ฐ’ ์ฐพ๊ธฐ
  • ๋ฆฌ์ŠคํŠธ์˜ ๊ธธ์ด ๊ตฌํ•˜๊ธฐ
  • 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ์ˆซ์ž ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ (์–ธํด๋“œ ์‚ฌ์šฉ)

์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ๋ฌธ์ œ๋“ค์„ ํด๋“œ์™€ ์–ธํด๋“œ๋กœ ํ•ด๊ฒฐํ•ด๋ณด๋ฉด์„œ ๊ฐ์„ ์žก์•„๋ณด์„ธ์š”!

2. ๊ธฐ์กด ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ ๐Ÿ”„

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

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ด์š”:

sum [] = 0
sum (x:xs) = x + sum xs

์ด๊ฑธ ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š”:

sum = foldr (+) 0

์–ด๋•Œ์š”? ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•ด์กŒ์ฃ ? ใ…Žใ…Ž

3. ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์ ์šฉํ•ด๋ณด๊ธฐ ๐ŸŒณ

ํด๋“œ์™€ ์–ธํด๋“œ๋Š” ๋ฆฌ์ŠคํŠธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—๋„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŠธ๋ฆฌ, ๊ทธ๋ž˜ํ”„ ๋“ฑ ๋‹ค์–‘ํ•œ ๊ตฌ์กฐ์— ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์ ์šฉํ•ด๋ณด์„ธ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ์ด์ง„ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ํด๋“œ๋ฅผ ์ •์˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์–ด์š”:

data Tree a = Leaf a | Node (Tree a) (Tree a)

foldTree :: (a -> b) -> (b -> b -> b) -> Tree a -> b
foldTree f g (Leaf x) = f x
foldTree f g (Node left right) = g (foldTree f g left) (foldTree f g right)

์ด๋ ‡๊ฒŒ ์ •์˜ํ•œ ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  ๊ฐ’์˜ ํ•ฉ์„ ๊ตฌํ•˜๊ฑฐ๋‚˜, ํŠธ๋ฆฌ์˜ ๊นŠ์ด๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์–ด์š”.

4. ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ ๐Ÿ—๏ธ

์—ฐ์Šต์šฉ ๋ฌธ์ œ๋งŒ ํ’€๋‹ค ๋ณด๋ฉด ์‹ค์ œ ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ํ• ์ง€ ๊ฐ์ด ์•ˆ ์˜ฌ ์ˆ˜ ์žˆ์–ด์š”. ๊ทธ๋ž˜์„œ ์‹ค์ œ ํ”„๋กœ์ ํŠธ์— ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์ ์šฉํ•ด๋ณด๋Š” ๊ฒŒ ์ค‘์š”ํ•ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ์„ ๋งŒ๋“ ๋‹ค๊ณ  ํ•ด๋ด์š”. ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ์ฒ˜๋ฆฌ๋ฅผ ๊ฑฐ์น˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ๊ฐ ๋‹จ๊ณ„๋ฅผ ํ•จ์ˆ˜๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ํด๋“œ๋กœ ์กฐํ•ฉํ•  ์ˆ˜ ์žˆ์–ด์š”:

processData :: [String] -> [Int]
processData = foldr (.) id [parse, validate, transform, aggregate]

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ์•„์ฃผ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

5. ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ์ฝ”๋“œ ์ฝ๊ธฐ ๐Ÿ“š

ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์ž˜ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฝ”๋“œ๋ฅผ ์ฝ์–ด๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ๋‚˜ Haskell ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฐพ์•„๋ณด์„ธ์š”. ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ด ๊ฐœ๋…๋“ค์„ ํ™œ์šฉํ•˜๋Š”์ง€ ๋ณด๋ฉด ๋งŽ์€ ๊ฑธ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด์š”.

6. ๋„์ „! ๋ณต์žกํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๊ธฐ ๐Ÿ†

๊ธฐ๋ณธ๊ธฐ๋ฅผ ์ตํ˜”๋‹ค๋ฉด, ์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ์— ๋„์ „ํ•ด๋ณด์„ธ์š”. ์˜ˆ๋ฅผ ๋“ค์–ด:

  • ํด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ€ต์†ŒํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ์–ธํด๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋ฆผ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ตฌํ˜„ํ•˜๊ธฐ
  • ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์กฐํ•ฉํ•ด์„œ ๊ทธ๋ž˜ํ”„ ์ˆœํšŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋งŒ๋“ค๊ธฐ

์ด๋Ÿฐ ๋ณต์žกํ•œ ๋ฌธ์ œ๋“ค์„ ํ•ด๊ฒฐํ•˜๋‹ค ๋ณด๋ฉด ํด๋“œ์™€ ์–ธํด๋“œ์˜ ์ง„์ •ํ•œ ํž˜์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

๐Ÿ’ก ๊ฟ€ํŒ: ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์—ฐ์Šตํ•  ๋•Œ๋Š” ํ•ญ์ƒ "์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?"๋ผ๊ณ  ์ž๋ฌธํ•ด๋ณด์„ธ์š”. ์ข…์ข… ๋†€๋ผ์šด ํ•ด๋‹ต์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์ž, ์—ฌ๊ธฐ๊นŒ์ง€ ํด๋“œ์™€ ์–ธํด๋“œ๋ฅผ ์‹ค์ œ๋กœ ์—ฐ์Šตํ•˜๊ณ  ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ดค์–ด์š”. ์–ด๋•Œ์š”? ์ด์ œ ์ข€ ๋” ์ž์‹ ๊ฐ์ด ์ƒ๊ธฐ๋‚˜์š”? ใ…Žใ…Ž

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

๊ทธ๋ฆฌ๊ณ  ๋˜ ํ•˜๋‚˜! ํ˜ผ์ž ๊ณต๋ถ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ํ•จ๊ป˜ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ•˜๋Š” ๊ฒƒ๋„ ์ •๋ง ์ค‘์š”ํ•ด์š”. ์žฌ๋Šฅ๋„ท(https://www.jaenung.net)๊ฐ™์€ ํ”Œ๋žซํผ์„ ํ™œ์šฉํ•ด์„œ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค๊ณผ ์ง€์‹์„ ๊ณต์œ ํ•˜๊ณ , ์„œ๋กœ์˜ ์ฝ”๋“œ๋ฅผ ๋ฆฌ๋ทฐํ•ด์ฃผ๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์—์š”. ํ•จ๊ป˜ ์„ฑ์žฅํ•˜๋ฉด ํ›จ์”ฌ ๋” ๋น ๋ฅด๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ต๋‹ˆ๋‹ค! ๐Ÿ˜Š

์ž, ์ด์ œ ์ •๋ง ๋์ด์—์š”! ํด๋“œ์™€ ์–ธํด๋“œ์— ๋Œ€ํ•ด ์ •๋ง ๋งŽ์€ ๊ฑธ ๋ฐฐ์› ์ฃ ? ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ ์‹ค์ œ ํ™œ์šฉ, ์žฅ๋‹จ์ , ๊ทธ๋ฆฌ๊ณ  ์—ฐ์Šต ๋ฐฉ๋ฒ•๊นŒ์ง€! ์—ฌ๋Ÿฌ๋ถ„์˜ Haskell ์—ฌ์ •์— ์ด ์ง€์‹์ด ํฐ ๋„์›€์ด ๋˜๊ธธ ๋ฐ”๋ผ์š”. ํ™”์ดํŒ…! ๐Ÿš€