飯吹いた

オレオレマージソートの一部

  let rec merge_two ls1 ls2 ret =
    match ls1, ls2 with
      | x1 :: xs1, x2 :: xs2 ->
	  if (comp x1 x2) then
	    merge_two xs1 ls2 (x1 :: ret)
	  else
	    merge_two ls1 xs2 (x2 :: ret)
      | ls1, [] -> rev_append ls1 ret
      |	[], ls2 -> rev_append ls2 ret in
  let rec merge_two_rev ls1 ls2 ret =
    match ls1, ls2 with
      | x1 :: xs1, x2 :: xs2 ->
	  if (comp x2 x1) then
	    merge_two_rev xs1 ls2 (x1 :: ret)
	  else
	    merge_two_rev ls1 xs2 (x2 :: ret)
      | ls1, [] -> rev_append ls1 ret
      |	[], ls2 -> rev_append ls2 ret in

標準ライブラリの(マージ)ソートの一部

  let rec rev_merge l1 l2 accu =
    match l1, l2 with
    | [], l2 -> rev_append l2 accu
    | l1, [] -> rev_append l1 accu
    | h1::t1, h2::t2 ->
        if cmp h1 h2 <= 0
        then rev_merge t1 l2 (h1::accu)
        else rev_merge l1 t2 (h2::accu)
  in
  let rec rev_merge_rev l1 l2 accu =
    match l1, l2 with
    | [], l2 -> rev_append l2 accu
    | l1, [] -> rev_append l1 accu
    | h1::t1, h2::t2 ->
        if cmp h1 h2 > 0
        then rev_merge_rev t1 l2 (h1::accu)
        else rev_merge_rev l1 t2 (h2::accu)
  in

なんかまる写ししたみたいだ。