将列表转换为Mercury中的元组列表

时间:2010-12-17 02:41:32

标签: mercury

我只是汞的初学者,发现很难解决这个问题。我想将列表转换为从较小到较高频率排序的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}]

您可以看到所有元组列表都从较小到较高的频率进行排序。

我在问是否有人可以帮助我解决它或指向教程的指针,我可以在其中找到更多提示。

感谢您的回复。

1 个答案:

答案 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).