如何使用 ocaml 中的键和值对元组列表进行排序?

How to sort a list of tuples using both key and value in ocaml?

我有一个元组列表,例如 (1, "a"), (2, "b"), (3, "c"),我想对它们进行排序

1个 2乙 3 b

其中数字顺序优先,然后是字母顺序。就像我有

(1, “鲍勃”), (1, “猫”)

看起来像

1 鲍勃 1 只猫

这就是我正在尝试的

let mylist =  List.sort (fun (c1, s1) (c2, s2) -> Pervasives.compare c2 c1 ) -> Pervasives.compare s1 s2) mysortedlist

但这显然在语法上是错误的。

如果只按数字顺序排序的话是这样的

let mylist =  List.sort (fun (c1, _) (c2, _) -> compare c2 c1) mylist

此外,这些 let 语句是更大的 let 块的一部分,在语句中,我只关注这个特定部分。

提前致谢。

编辑:我也想按字母顺序的相反顺序执行此操作。

例如,(1, "bob"), (1, "cat") (0, "zebra") 应该是这样的

0 斑马 1 鲍勃 1 只猫

这很简单。您传递给 List.sort 的函数只需要比较值 如果 键相同

List.sort 
  (fun (k1, v1) (k2, v2) -> 
    if k1 = k2 then compare v1 v2 
    else compare k1 k2) 
  [(1, "B"); (2, "C"); (2, "A")]

结果是:

[(1, "B"); (2, "A"); (2, "C")]

或者,因为它使我们免于对 k1k2 进行相等性检查,可能 运行 compare 在他们身上:

List.sort 
  (fun (k1, v1) (k2, v2) ->
    match compare k1 k2 with
    | 0 -> compare v1 v2
    | c -> c)
  [(1, "B"); (2, "C"); (2, "A")]