Конвертировать список в список кортежей в Mercury - PullRequest
2 голосов
/ 17 декабря 2010

Я всего лишь новичок в ртути, и мне трудно решить эту проблему. Я хочу преобразовать список в список записей, отсортированных от меньших к более высоким частотам. Например:

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 Ответ

4 голосов
/ 06 февраля 2011

Стандартная библиотека имеет, например, тип данных 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).
...