mergesort :: (Ord a) => [a] -> [a] mergesort [] = [] mergesort (x:xs) = let halfLength xs = truncate $ (fromIntegral . length) xs / 2 (left, right) = splitAt (halfLength (x:xs)) (x:xs) merge :: (Ord a) => [a] -> [a] -> [a] merge [] _ = [] merge _ [] = [] merge (x:xs) (y:ys) | x > y = x : xs `merge` (y:ys) | x <= y = y : (x:xs) `merge` ys | otherwise = x : y : xs `merge` ys in mergesort left `merge` mergesort right