하스켈을 오늘 처음 접한 에이쥬어라고 합니다. 절차형 언어만 하다가 하스켈 같은 함수형 언어를 잡아 보니 신기합니다.
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 특징을 사용해서 할 수도 있겠지만, 그런 경우는 굳이 할 필요가 없어서 뺐답니다.
다시 시작해 볼까 하는 생각도 있기는 한데, 나 혼자만의 자족적인 일인 것 같다는 생각도 들어서.... ㅎㅎㅎ
관련자료
알고 계실지도 모르겠지만 그런 책들이 벌써 있습니다
http://www.iro.umontreal.ca/~lapalme/Algorithms-functional.html
http://www.cambridge.org/us/catalogue/catalogue.asp?isbn=0521663504