アソシエーションリストを作成する簡単なOCaml関数を書いています。入力は、stringと同じ順序でユニークでない単語のリストに変換された文字列であり、出力は(単語、[リストのインデックス])の関連リストです。OCamlでリストを手動で減らす
例は
let f "a b c b a b" = ...
expected output => [("a", [0,4]), ("b", [1,3,5]), ("c", [2])] # order not important
これまでのところ、私はこの中間出力に
[("b", 5); ("a", 4); ("b", 3); ("c", 2); ("b", 1); ("a", 0)]
を得るために管理しているが、私は最終的な結果にこれを削減する方法を理解しようとして立ち往生しています。
元の入力からHashtbl
を作成する方が適切でしょうか?次に、Hashtbl
- >list
??
中間結果を減らすのは簡単ですか?私が働いている環境はList.reduce
にアクセスできないので、手動でreduce関数を書く必要があります。
これを見てみると、Hashtbl
は単語の数が増えるにつれて効率が良いようです。
EDIT:Hashtbl
は確かに行く方法のようです。私はすでに、次のハッシュテーブルがあります。
"a" : [4,0], "b" : [5,3,1], "c" : [2]
をしかし、私は今のリストに変換する方法を見つけ出すことはできません。 Hashtbl.iter
はすべての個々のバインディングで動作します。たとえば、目的を破る("a", 4)
と("a", 0)
を別々に(私の理解で)繰り返します。提案?
そのa(文字列、intリスト)Hashtbl.tしかし、Hashtbl.iter(またはfold)のドキュメントを読むと、リストをキーにバインドするものとして扱われないように思えますが、代わりに各リスト要素はキーとは別のバインディングです。私は間違っていますか? thx –
その後、 'Hashtbl.iter'または' Hashtbl.fold'を使うことができます。やってみて! –
はあなたが返信したときにコメントを編集していました。しかし、私はHashtbl.iter(またはfold)のドキュメントを読むと、リストをキーにバインドするものとして扱わないように聞こえますが、代わりに各リスト要素はキーへのバインディングを分離する。私は間違っていますか?thx " –