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}]

タプルのすべてのリストが頻度の低いものから高いものへと並べ替えられていることがわかります。

誰かがそれを愛するのを手伝ってくれるか、それを行うためのより多くのヒントを見つけることができるチュートリアルへのポインタを求めています.

お返事をありがとうございます。

4

1 に答える 1

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).
于 2011-02-06T16:58:26.540 に答える