합병 정렬하기

하스켈을 오늘 처음 접한 에이쥬어라고 합니다. 절차형 언어만 하다가 하스켈 같은 함수형 언어를 잡아 보니 신기합니다.

merge2 a [] = a
merge2 [] b = b
merge2 (x:xs) (y:ys) 
   | x < y = x:merge2 xs (y:ys)
   | x > y = y:merge2 (x:xs) ys
   | otherwise = x:y:merge2 xs ys 

mergesort [] = []
mergesort (x:xs) = merge2 [x] (mergesort xs)


*Main> mergesort [1,5,4,3,7,9]
[1,3,4,5,7,9]

솔직히 루비로 짤 때에 비해서 그리 짧아 보이지 않습니다만, 제가 미숙한 탓이겠죠.

더 하스켈스러운 코드라면 어떤 것이 있을까요?

댓글 보기 옵션

원하시는 댓글 전시 방법을 선택한 다음 "설정 저장"을 누르셔서 적용하십시오.

이런..

인덴트가 빠져 버렸군요 :(

그리고 사실상 합병 정렬로 작동 안하겠군요. 어떻게 수정하면 될지 고민해봐야겠습니다.

들여쓰기가 보이도록

들여쓰기가 보이도록 수정했습니다. 아래 링크에 보시면 OCaml로 작성한 합병정렬 예제가 있습니다. Haskell과 OCaml은 거의 비슷하니까 참고하세요.
http://plus.kaist.ac.kr/~shoh/ocaml/algorithms_for_fp/html/ch05s05.html

algorithms_for_fp 현재는 중단한 상태

책에 나와있는 대부분의 알고리즘을 functional language 로 구현해 보는 것을 목표로 진행을 하다가 현재는 중단한 상태입니다.

그렇게 정리를 하다 보니까, 어떤 알고리즘은 functional style 로 하는 것은 imperative style 로 하는 것보다 시간이 많이 걸리는 경우도 있더군요.
Ocaml 의 imperative 특징을 사용해서 할 수도 있겠지만, 그런 경우는 굳이 할 필요가 없어서 뺐답니다.

다시 시작해 볼까 하는 생각도 있기는 한데, 나 혼자만의 자족적인 일인 것 같다는 생각도 들어서.... ㅎㅎㅎ

관련자료