一つの方法は、最初(2,"c")
ような順序対など
[(3,["a"]),(2,["b"]),(1,["a","e"])]
として順序付けられたペアのリストを受け取り、該当するリストに仮止め要素を有する修飾リストを返す関数を書くこと(または
[(3,["a"]),(2,["c","b"]),(1,["a","e"])]
次の関数は、トリックを行います:
が存在しない場合、結果は次のようになりますように)新しい(キー、リスト)のペアを作成し、
キーと値の対応するリストのリストを考えると、あなたはキーと値の対応ジッパーの上に、この最後の機能を折ることができます。たとえば
fun group ks vs = foldl store [] (ListPair.zip(ks,vs));
、
val original = [1, 2, 0, 1, 1, 2];
val elements = ["a","b","c","d","e","f"];
- group original elements;
val it = [(1,["e","d","a"]),(2,["f","b"]),(0,["c"])] : (int * string list) list
場合必要に応じて、このリストをキーに従ってソートすることができます。最後に
- あなただけのグループ(リスト内の元の順序に一致するように逆に)以下の作品たい場合:編集オン
fun groups ks vs = map rev (#2 (ListPair.unzip (group ks vs)));
例えば、
- groups original elements;
val it = [["a","d","e"],["b","f"],["c"]] : string list list
を:あなたが@SimonShineのアイデアを使用してソートされた順序でデータを格納するか、またはgroup
関数の出力をソートすることができます。 。やや奇妙なことに、SML Standard Basis Library lacks a built-in sortですが、標準の実装には独自のソートがあります(独自の書き方は簡単です)。たとえば、あなたが書くことができSML/NJのソートを使用して:
期待に大手 fun sortedGroups ks vs =
let
val g = group ks vs
val s = ListMergeSort.sort (fn ((i,_),(j,_)) => i>j) g
in
map rev (#2 (ListPair.unzip s))
end;
:最初k
は彼らが価値あるペア(k, vs)
のリストを形成するのが一般的な戦略で
- sortedGroups original elements;
val it = [["c"],["a","d","e"],["b","f"]] : string list list
は何に動作しません
は
original : 'a list
とcmp : 'a * 'a -> order
いくつかのことが存在すると仮定しますか? – cevingスマートなアプローチを作成するプロセス。 – brumbrum
これは10日前に[等価クラスへのリストの分割](http://stackoverflow.com/questions/40577169/partition-a-list-into-equivalence-classes)と同じように見えます。あなたの2つのリストと '' ListPair.zip''を、その番号だけを扱う等価関数で呼び出します。また、Haskellの['group'](https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:group)/ [' groupBy']( https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html#v:groupBy)、ソースコードは読みにくいかもしれません。 –