5.

halve xs = splitAt (div (length xs) 2) xs

msort [] = []

msort [x] = [x]

msort xs =

  merge (msort ys) (msort zs)

  where (ys, zs) = halve xs



6.

-- summation of elements of a list

1) sum :: [Int] -> Int

2) sum [] =

   sum (x : xs) = 

3) sum [] = 0

4) sum (x : xs) = x + sum xs

5) sum :: Num a => [a] - a

   sum = foldr (+) 0


-- getting sublist from a list by certain number

1) take :: Int -> [a] -> [a]

2) take 0 [] =

   take 0 (x : xs) =

   take (n + 1) [] =

   take (n + 1) (x : xs) =

3) take 0 [] = []

   take 0 (x : xs) = []

   take (n + 1) [] = []

   take (n + 1) (x : xs) =

4) take (n + 1) (x : xs) = x : take n xs

5) take :: Int -> [a] -> [a]

   take 0 _ = []

   take (n + 1) [] = []

   take (n + 1) (x : xs) = x : take n xs 


-- getting last element from nonempty list

1) last :: [a] -> [a]

2) last (x : xs) = 

3) last (x : xs) | null xs = x

4) last (x : xs) | null xs = x

                 | otherwise = last xs

5) last :: [a] -> [a]

   last [x] = x

   last (_ : xs) = last xs


halve :: [a] -> ([a], [a])

halve a = (take ((length a) `div` 2) a, drop ((length a) `div` 2) a)


safetail :: [a] -> [a]

safetail a = if null a then a else tail a


replicater :: Int -> a -> [a]
replicater 0 x = []
replicater n x = replicater (n-1) x ++ [x]


한역판 입문서가 두 개 있는데...
가장 쉬운 하스켈 책 -- 이거 추천
하스켈로 배우는 프로그래밍 -- 이거 비추천. 이유는 오탈자가 많고, 번역 방침도 약간 이질적임.


언어 자체는 정말 좋은 편이다.

난이도가 과대포장된 면이 있는데,

실제로 써 보면, 스칼라나 클로저에 비해서 규모도 작고 배우기도 쉽다.

수학형 전산과 학생에게는 입문용 cs101언어로 이것만큼 적합한 것도 없을 듯 하다.


전기전자형 전산과 학생에게는 물론 C가 낫겠지만...