我只是汞的初学者,发现很难解决这个问题。我想将列表转换为从较小到较高频率排序的tupples列表。例如:
string.to_char_list("this is a test") becomes
[{'a', 1}, {'e', 1}, {'h', 1}, {'i', 2}, {' ', 3}, {'s', 3}, {'t', 3}]
OR
[3,2,1,2,1,1,2] becomes
[{3, 1}, {1, 3}, {2, 3}]
您可以看到所有元组列表都从较小到较高的频率进行排序。
我在问是否有人可以帮助我解决它或指向教程的指针,我可以在其中找到更多提示。
感谢您的回复。
答案 0 :(得分:4)
标准库具有bag数据类型,可以很好地准备好所有工具。您基本上只需将列表转换为包,然后将包转换回具有频率的列表。然后使用列表排序将其排序为您想要的。或者您也可以手动执行相同操作并使用地图作为累加器折叠列表,其中存储遇到的元素及其出现次数。
包的一个例子:
:- module freq.
:- interface.
:- import_module io.
:- pred main(io::di, io::uo) is det.
:- implementation.
:- import_module string.
:- import_module list.
:- import_module assoc_list.
:- import_module bag.
main(!IO) :-
List = string.to_char_list("this is a test"),
bag.from_list(List, Bag),
bag.to_assoc_list(Bag, ElemSortedAssocList),
list.sort(assoc_list.reverse_members(ElemSortedAssocList), CountSortedAssocList),
assoc_list.reverse_members(CountSortedAssocList, Result),
io.write(Result, !IO),
io.nl(!IO).