π λ°λ³΅λ¬Έ λμ μ¬κ·λ‘
Haskell
μμλ λ°λ³΅μ μννκΈ° μν΄ loop
λ₯Ό μννλ κ²μ΄ μλλΌ μ¬κ·
λ₯Ό νμ©ν©λλ€.
π Tail Call Elimination
μΌλ°μ μΌλ‘ νλ‘κ·Έλλ° μΈμ΄μμ μ¬κ·νΈμΆ
μ μ½μ€νμ μκΈ° λλ¬Έμ λ©λͺ¨λ¦¬ μ΄μκ° λ°μν κ°λ₯μ±μ΄ μμ΅λλ€.
νμ§λ§ Haskell
κ³Ό κ°μ ν¨μν μΈμ΄μμλ Tail-Call Elimination
λ₯Ό ν΅ν΄ μ΅μ νλ₯Ό μνν©λλ€.
π Lazy Evaluation
Haskell
μ μ§μ° νκ°λ₯Ό ν΅ν΄ μ€νλ©λλ€.
λ°λΌμ κ°μ΄ νμν μμ μ νκ°λ₯Ό νλ©° νμνμ§ μλ€λ©΄ νκ°νμ§ μμ΅λλ€.
π μμ λ‘ μ΅νκΈ°
maximum
μ 리μ€νΈμ μμ μ€ κ°μ₯ ν° κ°μ λ°ννλ ν¨μμ
λλ€.
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs) = max x (maximum' xs)
result = maximum' [4, 5, 9, 2]
main = putStrLn (show result) -- β
9
μ¬κΈ°μ (x:xs)
λ λ°°μ΄μ μμλ₯Ό λΆλ¦¬νλ μμ£Ό μ¬μ©λλ ν¨ν΄μ
λλ€.
replicate
λ λ κ°μ μΈμ (n, m) μ λ°μμ nμ mκ° λ§νΌ κ°μ§λ μλ‘μ΄ λ°°μ΄μ λ°ννλ ν¨μμ
λλ€.
replicate' n m
| m <= 0 = []
| otherwise = n:replicate' n (m-1)
result = replicate' 2 5
main = putStrLn (show result) -- [2,2,2,2,2]
μ¬κΈ°μ |
μ otherwise
λ Haskell
μ guard
λ¬Έλ²μ
λλ€.
if
λ¬Έκ³Ό μ μ¬νλ°, κ°κ°μ 쑰건μ μ’ λ λͺ
ννκ² νμ
ν μ μμΌλ©° ν¨ν΄λ§€μΉκ³Ό κΆν©μ΄ μ’μ΅λλ€.
take
λ λ κ°μ μΈμ x
μ arr
μ λ°μμ arr
μμ x
κ° λ°νΌ μ¬λΌμ΄μ±ν κ²°κ³Όλ₯Ό λ°νν©λλ€.
take' n _
| n <= 0 = []
take' _ [] = []
take' n (x:xs) = x : take' (n-1) xs
result = take' 2 [5, 4, 3, 2]
main = putStrLn (show result) -- [5,4]
reverse
λ λ°°μ΄μ λ€μ§λ ν¨μμ
λλ€.
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
result = reverse' [1, 2, 3, 4]
main = putStrLn (show result) -- [4, 3, 2, 1]
zip
μ λ λ°°μ΄μ λ°μμ κ°κ°μ index λ‘ λ§€νλ λ°°μ΄μ λ°ννλ ν¨μμ
λλ€.
zip' _ [] = []
zip' [] _ = []
zip' (x:xs) (y:ys) = [(x, y)] ++ zip xs ys
result = zip' [1, 2, 3, 4] [5, 6, 7]
main = putStrLn (show result) -- [(1,5),(2,6),(3,7)]
elem
μ λ°°μ΄μ νΉμ μμκ° μ‘΄μ¬νλμ§ νλ¨νλ ν¨μμ
λλ€.
elem' e [] = False
elem' e (x:xs)
| e == x = True
| otherwise = elem' e xs
result = elem' 3 [5, 6, 7]
main = putStrLn (show result) -- False
quicksort
λ λ°°μ΄μ μ λ ¬νλ μκ³ λ¦¬μ¦μ
λλ€.
Haskell
μ μ΄μ©νλ©΄ λͺ
ννκ³ κ°κ²°ν λ°©μμΌλ‘ μ΄ μκ³ λ¦¬μ¦μ ꡬνν μ μμ΅λλ€.
quick sort
λ₯Ό μ§§κ² μ€λͺ
νλ©΄, pivot
μ κΈ°μ€μΌλ‘ μμ μμλ€μ λͺ¨μ λ°°μ΄ A μ
ν° μμλ€λ§ λͺ¨μ B λ₯Ό λΆλ¦¬ν λ€μ μ΄ μΈ κ·Έλ£Ήμ νλλ‘ ν©μΉ λ€,
pivot
μ μ μΈν λλ¨Έμ§ λ κ·Έλ£Ήμ λν΄μ λμΌν λ°©μμΌλ‘ μ λ ¬μ ν΄λκ°λ λΆν μ 볡
λ°©μμ
λλ€.
edge-case λ μμ λΉ λ°°μ΄μΌ κ²½μ° μ λ ¬ν νμμμ΄ []
λ₯Ό λ°νν΄μ£Όλ©΄ λ κ²μ
λλ€.
quicksort [] = []
quicksort (x:xs) =
let smaller = quicksort [y | y <- xs, y < x]
bigger = quicksort [y | y <- xs, y >= x]
in smaller ++ [x] ++ bigger
result = quicksort [5, 1, 9, 4, 6, 7, 3]
main = putStrLn (show result) -- [1,3,4,5,6,7,9]
μ¬κΈ°μ μλ‘κ² λ±μ₯νλ 2κ°μ§ λ¬Έλ²μ΄ μμ΅λλ€.
list comprehension
λ λ°°μ΄μ μΈλΌμΈμΌλ‘ μμ±νλ syntactic sugar
μ
λλ€.
let
κ³Ό in
μ ν¨κ» μ¬μ©νμ¬ νΉμ λ¬Έλ§₯μμ μ¬μ©νλ μ§μ λ³μλ₯Ό μ μν μ μμ΅λλ€.
π‘ list comprehension
μ΄λ λ°°μ΄μ μμ±νλ νλμ λ°©λ²μ λλ€.
μ¬κΈ°μλ generator μ guard λ€μ ν¨κ» μ¬μ©νμ¬ filter λ±μ λμμ ꡬνν μλ μμ΅λλ€.
[(i, j) | i <- [1,2], j <- [1,2]] -- [(1, 1), (1, 2), (2, 1), (2, 2)]
π μ¬κ·μ μΌλ‘ μκ°νκΈ°
μ§κΈκΉμ§ μ¬λ¬ μμ λ€μ μ¬κ·ν¨μλ‘ κ΅¬νν΄λ³΄λ©΄μ μΌμ ν ν¨ν΄μ΄ μλ€λ κ²μ΄ λ³΄μΌ κ²μ λλ€.
- κΈ°μ μΌμ΄μ€ μκ°ν΄λ³΄κΈ° (μ£Όλ‘ μ΄λ―Έ μ°λ¦¬κ° λ΅μ μκ³ μλ μΌμ΄μ€)
- λ¬Έμ λ₯Ό μκ² λ§λ€κΈ°
- μμ λ¬Έμ μ μλ λ¬Έμ μ¬μ΄μ μ°¨μ΄ μ€μ΄κΈ°
π μ°Έκ³ μλ£
'π archive' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Haskell Tutorial] Data Type (0) | 2022.12.31 |
---|---|
[Haskell Tutorial] High Order Function (0) | 2022.12.31 |
[Haskell Tutorial] Module (0) | 2022.11.28 |
[Haskell Tutorial] Type (0) | 2022.11.28 |
[Haskell Tutorial] Function & Chaining (0) | 2022.11.28 |
π¬ λκΈ