Haskell 재귀by Pigbrain

maximum

  1. # maximum.hs
  2. maximum' :: (Ord a) => [a] -> a
  3. maximum' [] = error "maximum of empty list!"
  4. maximum' [x] = x
  5. maximum' (x:xs) = max x (maximum' xs)
  6. ghci> maximum' [1, 3, 2, 7, 4]
  7. 7

replicate

  • replicate는 Int와 값을 받아서 그 값을 몇 번 반복한 리스트를 리턴한다
  1. # replicate.hs
  2. replicate' :: Int -> a -> [a]
  3. replicate' n x
  4. | n <= 0 = []
  5. | otherwise = x : replicate' (n-1) x
  6. ghci> replicate' 3 'k'
  7. "kkk"

take

  • 지정된 리스트에서 지정된 개수의 요소를 반환한다
  1. #take.hs
  2. take' ::(Num i, Ord i) => i -> [a] -> [a]
  3. take' n _
  4. | n <= 0 = []
  5. take' _ [] = []
  6. take' n (x:xs) = x : take' (n-1) xs
  7. ghci> take' 3 "Hello"
  8. "Hel"

reverse

  1. # reverse.hs
  2. reverse' :: [a] -> [a]
  3. reverse' [] = []
  4. reverse' (x:xs) = reverse' xs ++ [x]
  5. ghci> reverse' "HelloWorld"
  6. "dlroWolleH"

repeat

  • repeat 함수는 요소를 받아서 그 요소로 구성된 무한의 리스트를 반환한다
  1. # repeat.hs
  2. repeat' :: [a] -> [a]
  3. repeat' x = x : repeat' x

zip

  • zip 함수는 두 개의 리스트를 받아서 하나의 리스트로 합친다
  • 두 개의 리스트 길이가 다를 경우에 긴 리스트 쪽을 잘라낸다
  • zip [1,2,3] [7,8]은 [(1,7), (2,8)]을 반환한다
  1. # zip.hs
  2. zip' :: [a] -> [b] -> [(a, b)]
  3. zip' _ [] = []
  4. zip' [] _ = []
  5. zip' (x:xs) (y:ys) = (x, y):zip' xs ys
  6. ghci> zip' [1, 2, 3] [4, 5]
  7. [(1,4),(2,5)]

elem

  • elem 함수는 값과 리스트를 받아서 그 값이 리스트의 멤버인지를 검사한다
  1. # elem.hs
  2. elem' :: (Eq a) => a -> [a] -> Bool
  3. elem' _ [] = False
  4. elem' a (x:xs)
  5. | a == x = True
  6. | otherwise = a `elem'` xs
  7. ghci> elem' 'e' "Hello World"
  8. True
  9. ghci> elem' 'z' "Hello World"
  10. False

quicksort

  1. # quicksort.hs
  2. quicksort :: (Ord a) => [a] -> [a]
  3. quicksort [] = []
  4. quicksort (x:xs) =
  5. let smallerOrEqual = [a | a <- xs, a <= x]; larger = [a | a <- xs, a > x]
  6. in quicksort smallerOrEqual ++ [x] ++ quicksort larger
  7. ghci> quicksort [1, 3, 2, 9, 7, 10, 13]
  8. [1,2,3,7,9,10,13]

참고

  • http://www.yes24.com/24/Goods/12155304?Acode=101
Published 18 January 2017