クイックソートとマージソート書いてみた

Haskellの書き方がよくわからないので,入門サイトを見てクイックソートを書き写してみる.

qsort [] = []
qsort (x:xs) = qsort [y | y <- xs, y < x] ++ [x] ++ qsort [y | y <- xs, y >= x]

main = print (qsort [3, 1, 4, 1, 5, 9, 2, 6])

うーん.
マージソートくらいなら書けそうな気がしてきたので,試行錯誤しながら自力で書いてみる.

split list = let len = div (length list) 2
             in (take len list, drop len list)

mergesort [] = []
mergesort [x] = [x]
mergesort list = case split list of
                      (xs,ys) -> merge (mergesort xs) (mergesort ys)

merge [] [] = []
merge [] yys = yys
merge xxs [] = xxs
merge xxs@(x:xs) yys@(y:ys) | x < y = x:merge xs yys
                            | otherwise = y:merge xxs ys

main = print (mergesort [3, 1, 4, 1, 5, 9, 2, 6])

できたっぽい.
パターンマッチとか,OCamlと似たようなノリで書いてるけどなんとかなるのかな.
これまたOCamlと同じで,はてなの色付けが地味だなぁ.