Конвертировать список в список кортежей в Mercury
Я всего лишь новичок в ртути, и мне трудно решить эту проблему. Я хочу преобразовать список в список наборов, отсортированных от меньших к более высоким частотам. Например:
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 ответ
Например, в стандартной библиотеке есть тип данных 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).