위키백과를 참고해서... 거의 그대로 짰습니다. OTL
let rec partition f l =음, 일단 C나 자바를 건드리던 입장에서는 메모리 효율성으로만 보면 이것 참 걱정이 됩니다. 뭐, 일장일단이 있겠거니 하고 넘어가봅니다. 그런데 어째 파이썬 코드로도 비슷하게 짤 수 있겠다 싶습니다.
match l with
| [] -> ([],[])
| hd::tl ->
let ret = f hd in
let (left, right) = (partition f tl) in
if ret then (left @ [hd], right) else (left, right @ [hd])
let rec quicksort l =
match l with
| [] -> []
| pivot::rest ->
let is_less x = x < pivot in
let (left, right) = partition is_less rest in
quicksort left @ [pivot] @ quicksort right
let rec print_list f l =
match l with
| [] -> ()
| hd::tl -> f hd; print_string " ";print_list f tl
let _ =
let data = [3; 4; 1; 6; 10; 5; 2; 7] in
let sorted = quicksort data in
print_list print_int sorted
def partition(f, l):
if len(l) == 0: return ([], [])
hd = l[0]; tl = l[1:]
(left, right) = partition(f, tl)
if (f(hd)): return (left + [hd], right)
else: return (left, right + [hd])
def quicksort(l):
if len(l) == 0: return []
pivot = l[0]; rest = l[1:]
(left, right) = partition(lambda x: x < pivot, rest)
return quicksort(left) + [pivot] + quicksort(right)
print quicksort([3, 4, 1, 6, 10, 5, 2, 7])
어때요. 아주 비슷한 느낌이죠? 파이썬에서도 함수가 객체로 취급되어 인자로 쉽게 넘길 수 있고, 형식을 명시하지 않기 때문에 프로그램 구조에서 아주 비슷한 냄새가 폴폴 풍깁니다.
반면, 파이썬은 아주 말랑말랑하지만 OCaml은 딱딱하다 못해 이빨이 부러질 정도라는 차이가 있습니다. 기본적으로 형식 추론과 동적 타이핑의 문제기도 합니다. 그에 더해, OCaml은 거의 대부분의 자료형들이 Immutable한 느낌입니다. 반면, 파이썬은 기본적으로 모든 객체들이 Mutable한 편입니다. 런타임에도 객체에 새로운 속성과 메서드를 집어넣을 수 있으니까요(경악). 어찌 보면 각자 죽이 맞는 조합이지만, 서로 성격이 완전히 다릅니다.
여하튼 이런 특성들에 대해서 이야기를 나눠볼 분이... 있으려나요! ^^;



덧글
chatmate 2009/09/09 22:54 # 답글
엇, 오캐멀~ 이야기 나눈게 바로 엊그제 같은데 어느새 착수하셨네요;;
최종욱 2009/09/09 22:59 #
내일 퀴즈 봅니다. 허허. ㅠㅠ
Corund 2009/09/10 15:17 # 답글
전 OCaml은 견고하다는 느낌, 동적 타입 언어는 불안불안한 느낌인데 좀 다르시네요 ^^;Immutable이 기본이기 때문에 함수형이 Concurrency에 강한 거겠죠. 뭐 메모리 문제는 GC를 믿을 수밖에 없나요 :)
최종욱 2009/09/10 22:45 #
아, 제가 잘못 썼나봅니다. 저도 비슷한 느낌을 받았습니다. ㅎㅎ 다른 분께서 Quicksort 예제에 대해서 말씀해주셔서 참고하고자 합니다.
gimmesilve 2009/09/10 19:02 # 삭제 답글
걱정하시는 것처럼 위에 있는 quick sort는 엄밀한 의미에서 진짜 quick sort 가 아닙니다. 이미 함수형 언어 관련 커뮤니티에서는 저건 함수형 언어로 사람들을 끌어들이기 위한 대표적인 낚시 정도로 인정하고 있죠(위와 동일한 알고리즘으로 하스켈에서는 2줄이면 quick sort를 작성할 수 있습니다).이에 관련해서는 http://www.haskell.org/haskellwiki/Introduction/Direct_Translation 나 http://augustss.blogspot.com/2007/08/quicksort-in-haskell-quicksort-is.html 를 참고하세요.
최종욱 2009/09/10 22:48 #
그렇죠. 진정한 퀵소트를 짰다는 Haskell 코드를 보니 unsafe 한 작동이 있네요. Immutable한 자료형을 벗어나니 상쾌한 기분입니다. 또한 세 줄 짜리 코드는 정말 명쾌하기 그지없군요. ^^ 재미있는 코드를 알려주셔서 감사합니다!
백승우 2009/10/05 15:14 # 답글
안녕하세요.. 오랜만입니다.OCaml이 하스켈과 어 ~ 많이 비슷한데 순간 생각했었는데..
하스켈 코드네요..^^
여전히 열심히 하시네요..ㅋㅋㅋ
최종욱 2009/10/14 05:28 #
^^; 먹고 살아야죠... ㅋㅋ