2010-12-17 2 views
2

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

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

Что вы пробовали до сих пор решить эту проблему? И это домашняя проблема? (Если так, ответ может быть немного поздним ...;) – 2011-02-06 09:50:24

ответ

4

В стандартной библиотеке имеется, например, тип данных мешка, в котором все инструменты готовы. Вы в основном просто конвертируете свой список в сумку, а затем конвертируете сумку обратно в список с частотами. Затем используйте сортировку для списков, чтобы отсортировать ее по своему усмотрению. Или вы можете сделать то же самое вручную и свернуть по списку с помощью карты в качестве аккумулятора, в котором вы храните встреченные элементы с их количеством встречаемости.

Пример с сумкой:

:- 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). 
Смежные вопросы