【发布时间】:2017-02-17 04:53:10
【问题描述】:
我正在尝试在最里面的列表代表一个单词的字符列表列表列表上使用 List.sort,我可以使用比较比较函数按字母顺序对最里面的列表进行排序。我想知道比较功能是什么样的?它的类型为 'a -> 'a -> int。
【问题讨论】:
标签: list sorting compare ocaml
我正在尝试在最里面的列表代表一个单词的字符列表列表列表上使用 List.sort,我可以使用比较比较函数按字母顺序对最里面的列表进行排序。我想知道比较功能是什么样的?它的类型为 'a -> 'a -> int。
【问题讨论】:
标签: list sorting compare ocaml
好的,所以char list 是一个单词,char list list 是单词列表。您正在对单词列表列表进行排序。单词列表的字母顺序是什么?哪个先出现,“骑车人”或“自行车短裤”?字典的顺序不一致。
如果您希望“自行车短裤”排在第一位,这是(递归)字典顺序。
碰巧内置的多态compare 使用字典顺序。所以你可以直接使用它:
# List.sort compare [[['b'; 'i'; 'k'; 'e'; 'r']];
[['b'; 'i'; 'k'; 'e']; ['s'; 'h'; 'o'; 'r'; 't'; 's']]];;
- : char list list list =
[[['b'; 'i'; 'k'; 'e']; ['s'; 'h'; 'o'; 'r'; 't'; 's']];
[['b'; 'i'; 'k'; 'e'; 'r']]
如果您想编写自己的比较函数,它只是一个带有两个您想要排序的类型参数的函数。要以忽略单词之间空格的顺序对单词列表进行排序,您可以使用此比较函数:
let catcompare a b = compare (List.concat a) (List.concat b)
# List.sort catcompare [[['b'; 'i'; 'k'; 'e']; ['s'; 'h'; 'o'; 'r'; 't'; 's']];
[['b'; 'i'; 'k'; 'e'; 'r']]];;
- : char list list list =
[[['b'; 'i'; 'k'; 'e'; 'r']];
[['b'; 'i'; 'k'; 'e']; ['s'; 'h'; 'o'; 'r'; 't'; 's']]]
如果您要对内部列表进行排序,那么问题不在于比较函数。您可以使用相同的内置compare。真正的问题是如何将函数应用于列表的所有元素并将结果收集到列表中。 (我将把它留作练习。如果您已经在使用List.sort,您应该知道在哪里寻找可能的想法。)
【讨论】: