OCaml - 如何排序对?

时间:2013-12-03 09:48:23

标签: sorting ocaml

我们有成对:

 (3,10000) (1,2),(2,11) (2,0) (2, 10) (1,1000000)

我们想订购:

 (1,2) (1,1000000), (2,0) (2, 10) (2,11) (3,10000)

如何在OCaml中完成?

1 个答案:

答案 0 :(得分:7)

List.sort函数可以对任何'a list进行排序,它采用类型为'a -> 'a -> int的比较函数,如果第一个参数严格小于第二个参数,则必须返回负数。如果它是严格的大,如果它们是相等的则为零。

let lexicographic_compare (x,y) (x',y') =
  let compare_fst = compare x x' in
  if compare_fst <> 0 then compare_fst
  else compare y y'

# List.sort lexicographic_compare [ (3,10000); (1,2); (2,11); (2,0); (2, 10); (1,1000000)];;
- : (int * int) list =
[(1, 2); (1, 1000000); (2, 0); (2, 10); (2, 11); (3, 10000)]

(此代码使用内置的compare函数对整数执行正确的操作。)

请注意,实际上compare函数已经按字典顺序比较了对,因此List.sort compare ...(不编写任何新代码)似乎可以正常工作。虽然它没有指定它如何在对上工作,所以它可能会在将来发生变化,并且依赖于这是糟糕的风格。如果您需要精确的比较订单,则应编写特定于域的比较。

(当然有些库已经提供了这个lexicographic_compare逻辑;但关键是要学会如何自己做。)