Haskell で一番有名(?)なコードを OCaml で書いてみた。
# let rec qsort = function [] -> [] | hd::tl -> qsort (List.filter (fun x -> x < hd) tl) @ [hd] @ qsort (List.filter (fun y -> hd <= y) tl) ;; val qsort : 'a list -> 'a list = <fun> # qsort [1;5;3;2;6;7;4;9];; - : int list = [1; 2; 3; 4; 5; 6; 7; 9]
はじめ List.filter に与える関数を (>hd) みたいに書いたらだめだった。 OCaml ではセクションは使えないらしい。演算子を関数的に使って部分適用ならok。
# let rec qsort' = function [] -> [] | hd::tl -> qsort' (List.filter ((>) hd) tl) @ [hd] @ qsort' (List.filter ((<=) hd) tl) ;; val qsort' : 'a list -> 'a list = <fun> # qsort' [1;5;3;2;6;7;4;9];; - : int list = [1; 2; 3; 4; 5; 6; 7; 9]