๐ง Haskell์ ํด๋์ ์ธํด๋: ์ฌ๊ท์ ์ถ์ํ ๐

์๋ ํ์ธ์, ์ฌ๋ฌ๋ถ! ์ค๋์ ์ข ํน๋ณํ ์ฃผ์ ๋ก ์ฐพ์์์ด์. ๋ฐ๋ก Haskell์ ํด๋์ ์ธํด๋์ ๋ํด ์๊ธฐํด๋ณผ ๊ฑด๋ฐ์. ์ด, ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ฃ ? ใ ใ ใ ๊ฑฑ์ ๋ง์ธ์! ์ ๊ฐ ์ฝ๊ณ ์ฌ๋ฐ๊ฒ ์ค๋ช ํด๋๋ฆด๊ฒ์. ๋ง์น ์นดํก์ผ๋ก ์๋ค ๋ ๋ ๊ฒ์ฒ๋ผ์! ๐
๋จผ์ , Haskell์ด ๋ญ์ง ๋ชจ๋ฅด๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์ค๋ช ํ์๋ฉด, Haskell์ ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์. ๋ญ๊ฐ ๊ณ ๊ธ์ง ๋๋ ๋์ฃ ? ใ ใ ๊ทผ๋ฐ ์ง์ง ๋งค๋ ฅ์ ์ธ ์ธ์ด๋๋๋ค. ํนํ ์ค๋ ๋ค๋ฃฐ ํด๋์ ์ธํด๋๋ Haskell์ ์ง์ง ๊ฟ๊ธฐ๋ฅ์ด์์!
๐ก TMI: Haskell์ด๋ผ๋ ์ด๋ฆ์ ์ํ์์ด์ ๋ ผ๋ฆฌํ์์ธ Haskell Brooks Curry์ ์ด๋ฆ์ ๋ฐ์ ์ง์ด์ก๋์. ๋ญ๊ฐ ์์ด ๋ณด์ด์ฃ ? ใ ใ
์, ์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ํด๋ณผ๊น์? ํด๋์ ์ธํด๋, ์ด ๋ ๊ฐ๋ ์ด ์ ์ค์ํ๋๊ณ ์? ๊ฐ๋จํด์! ์ด ๋ ์๋ค์ ์ฌ๊ท๋ฅผ ์ถ์ํํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฑฐ๋ ์. ์ฌ๊ท๊ฐ ๋ญ๋๊ณ ์? ์... ๊ทธ๋ฅ ํจ์๊ฐ ์๊ธฐ ์์ ์ ํธ์ถํ๋ ๊ฑฐ์์. ์ข ๋ณต์กํด ๋ณด์ด์ฃ ? ๊ทผ๋ฐ ์ด๊ฒ ์ง์ง ์ ์ฉํ๋ต๋๋ค!
๊ทธ๋ผ ์ด์ ๋ถํฐ ํด๋์ ์ธํด๋์ ๋ํด ํ๋์ฉ ์์๋ณผ๊ฒ์. ์ค๋น๋์ จ๋์? ๋ ์ธ ๊ณ ! ๐
๐ ํด๋(Fold): ๋ฐ์ดํฐ๋ฅผ ์ ๋ ๋ง๋ฒ โจ
ํด๋, ์์ด๋ก 'fold'๋ '์ ๋ค'๋ผ๋ ๋ป์ด์์. ์ข ์ด์ ๊ธฐ ์๊ฐ๋์์ฃ ? ใ ใ ํ๋ก๊ทธ๋๋ฐ์์์ ํด๋๋ ๋น์ทํ ๊ฐ๋ ์ด์์. ๋ฐ์ดํฐ๋ฅผ ํ๋๋ก '์ ์ด' ๋๊ฐ๋ ๊ฑฐ์ฃ .
ํด๋๋ ๋ฆฌ์คํธ๋ ํธ๋ฆฌ ๊ฐ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ํํ๋ฉด์ ๊ฐ ์์์ ์ด๋ค ์ฐ์ฐ์ ์ ์ฉํ๊ณ , ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋์ ํด๋๊ฐ๋ ํจ์์์. ๋ญ๊ฐ ์ด๋ ค์ ๋ณด์ด์ฃ ? ๊ฑฑ์ ๋ง์ธ์, ์์๋ฅผ ๋ค์ด๋ณผ๊ฒ์!
๐ ์์: ์ฌ๊ณผ ๋ฐ๊ตฌ๋๊ฐ ์๋ค๊ณ ์๊ฐํด๋ด์. ์ด ๋ฐ๊ตฌ๋์ ์ฌ๊ณผ๊ฐ 5๊ฐ ์์ด์. ์ฐ๋ฆฌ๋ ์ด ์ฌ๊ณผ๋ค์ ์ด ๋ฌด๊ฒ๋ฅผ ์๊ณ ์ถ์ด์. ์ด๋ป๊ฒ ํ ๊น์?
- ์ฒซ ๋ฒ์งธ ์ฌ๊ณผ์ ๋ฌด๊ฒ๋ฅผ ์ฐ๋ค.
- ๋ ๋ฒ์งธ ์ฌ๊ณผ์ ๋ฌด๊ฒ๋ฅผ ์ฌ๊ณ ์ฒซ ๋ฒ์งธ ์ฌ๊ณผ ๋ฌด๊ฒ์ ๋ํ๋ค.
- ์ธ ๋ฒ์งธ ์ฌ๊ณผ์ ๋ฌด๊ฒ๋ฅผ ์ฌ๊ณ ์ง๊ธ๊น์ง์ ์ด ๋ฌด๊ฒ์ ๋ํ๋ค.
- ์ด๋ ๊ฒ ๊ณ์ํด์ ๋ง์ง๋ง ์ฌ๊ณผ๊น์ง ๋ฐ๋ณตํ๋ค.
์ด๊ฒ ๋ฐ๋ก ํด๋์์! ์ฌ๊ณผ๋ค(๋ฐ์ดํฐ)์ ํ๋์ฉ '์ ์ด' ๋๊ฐ๋ฉด์ ์ด ๋ฌด๊ฒ(๊ฒฐ๊ณผ)๋ฅผ ๊ณ์ฐํ๋ ๊ฑฐ์ฃ .
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) ๊ฐ์ ํ๋ซํผ์ด ์ ๋ง ๋์์ด ๋ ์ ์์ด์. ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค๊ณผ ์ง์์ ๊ณต์ ํ๊ณ , ์๋ก์ ๊ฒฝํ์ ๋๋๋ฉด์ ํจ๊ป ์ฑ์ฅํ ์ ์๊ฑฐ๋ ์. ์ฌ๋ฌ๋ถ๋ ํ๋ฒ ์ฐธ์ฌํด๋ณด๋ ๊ฑด ์ด๋จ๊น์? ๐
์, ์ด์ ์ฐ๋ฆฌ๋ ํด๋์ ์ธํด๋์ ์ค์์ฑ์ ๋ํด ์์๋ดค์ด์. ํ์ง๋ง ๋ชจ๋ ๊ฒ์๋ ์ฅ๋จ์ ์ด ์์ฃ . ๋ค์ ์น์ ์์๋ ํด๋์ ์ธํด๋์ ์ฅ๋จ์ ์ ๋ํด ๋ ์์ธํ ์์๋ณผ ๊ฑฐ์์. ์ค๋น๋์ จ๋์? ๊ณ ๊ณ ! ๐
๐๐ ํด๋์ ์ธํด๋์ ์ฅ๋จ์ : ์๋ ์ ๊ฒ โ๏ธ
์, ์ด์ ์ฐ๋ฆฌ๋ ํด๋์ ์ธํด๋๊ฐ ์ผ๋ง๋ ๊ฐ๋ ฅํ๊ณ ์ ์ฉํ์ง ์๊ฒ ๋์ด์. ํ์ง๋ง ์ธ์์ ์๋ฒฝํ ๊ฑด ์์ฃ ? ใ ใ ใ ํด๋์ ์ธํด๋๋ ๋ง์ฐฌ๊ฐ์ง์์. ์ฅ์ ๋ ์์ง๋ง ๋จ์ ๋ ์์ด์. ํ๋ฒ ์์ธํ ์ดํด๋ณผ๊น์?
๐ ์ฅ์
- ์ฝ๋ ๊ฐ๊ฒฐ์ฑ: ํด๋์ ์ธํด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณต์กํ ๋ก์ง์ ์์ฃผ ๊ฐ๋จํ๊ฒ ํํํ ์ ์์ด์. ์๋ฅผ ๋ค์ด, ๋ฆฌ์คํธ์ ํฉ์ ๊ตฌํ๋ ํจ์๋ฅผ
sum = foldr (+) 0
์ด๋ ๊ฒ ํ ์ค๋ก ํํํ ์ ์์ฃ ! - ์ฌ์ฌ์ฉ์ฑ: ํ๋์ ํด๋๋ ์ธํด๋ ํจ์๋ก ๋ค์ํ ์ฐ์ฐ์ ์ํํ ์ ์์ด์. ํจ์๋ฅผ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ๋ ํน์ฑ ๋๋ถ์ด์ฃ .
- ์ถ์ํ: ๋ณต์กํ ์ฌ๊ท ๋ก์ง์ ์ถ์ํํด์ ๋ ๋์ ์์ค์์ ๋ฌธ์ ๋ฅผ ์๊ฐํ ์ ์๊ฒ ํด์ค์.
- ์ฑ๋ฅ ์ต์ ํ: ํนํ ํด๋์ ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํํ๊ธฐ ์ข์ ํํ๋ก ๋์ด ์์ด ์ฑ๋ฅ์ด ์ข์ ์ ์์ด์.
- ๋ฌดํ ๋ฐ์ดํฐ ๊ตฌ์กฐ: ์ธํด๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌดํํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์ด์.
๐ ๋จ์
- ํ์ต ๊ณก์ : ์ฒ์ ์ ํ๋ฉด ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ด์. ํนํ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํ์ง ์์ ์ฌ๋๋ค์๊ฒ๋ ๋์ฑ ๊ทธ๋์.
- ๊ฐ๋ ์ฑ ๋ฌธ์ : ๋๋ฌด ๋ณต์กํ ์ฐ์ฐ์ ํด๋๋ ์ธํด๋๋ก ํํํ๋ฉด ์คํ๋ ค ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง ์ ์์ด์.
- ๋๋ฒ๊น ์ ์ด๋ ค์: ํด๋๋ ์ธํด๋๋ก ์์ฑ๋ ์ฝ๋๋ ๋จ๊ณ๋ณ๋ก ์คํ ๊ณผ์ ์ ์ถ์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ด์.
- ์ฑ๋ฅ ์ด์: ์๋ชป ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์ฑ๋ฅ์ด ๋จ์ด์ง ์ ์์ด์. ํนํ ํฐ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์ฃผ์๊ฐ ํ์ํด์.
- ์ค๋ฒ์์ง๋์ด๋ง: ๊ฐ๋จํ ๋ฌธ์ ์ ํด๋๋ ์ธํด๋๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ ค ์ฝ๋๊ฐ ๋ณต์กํด์ง ์ ์์ด์.
๐ก ์ฃผ์์ฌํญ: ํด๋์ ์ธํด๋๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ง๋ง, ๋ชจ๋ ์ํฉ์ ์ ํฉํ ๊ฑด ์๋์์. ๋ฌธ์ ์ ํน์ฑ๊ณผ ํ์ ์ญ๋์ ๊ณ ๋ คํด์ ์ ์ ํ ์ฌ์ฉํด์ผ ํด์!
๊ฒฐ๊ตญ, ํด๋์ ์ธํด๋๋ ์๋ ์ ๊ฒ๊ณผ ๊ฐ์์. ์ ์ฌ์ฉํ๋ฉด ์ฝ๋๋ฅผ ์์ฒญ๋๊ฒ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์ง๋ง, ์๋ชป ์ฌ์ฉํ๋ฉด ์คํ๋ ค ๋ฌธ์ ๊ฐ ๋ ์ ์์ฃ . ๊ทธ๋์ ์ด ๊ฐ๋ ๋ค์ ์ฌ์ฉํ ๋๋ ํญ์ ์ ์คํด์ผ ํด์.
์๋ฅผ ๋ค์ด๋ณผ๊น์? ๋ฆฌ์คํธ์ ๋ชจ๋ ์์๋ฅผ 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 ์ฌ์ ์ ์ด ์ง์์ด ํฐ ๋์์ด ๋๊ธธ ๋ฐ๋ผ์. ํ์ดํ ! ๐
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ