我们有成对:
(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中完成?
答案 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
逻辑;但关键是要学会如何自己做。)