リスト内の各項目に重みを割り当てて、それを並べ替える関数を作成することができます。もし署名で関数を作成することができ:
assignWeight : String -> String -> (Int, String)
assignWeight typed listItem = ...
この関数は数値を割り当て、タプルの2番目の項目として、元の値と、タプルの最初の項目としてそれを返すことができます。
次に、重み付けアルゴリズムを構築するだけで、それらのルールは要件によって決定される必要があります。
たとえば、完全一致100を割り当てることができます。部分一致は、入力された文字列の一致度と、実際に一致する文字数によって決まります。これらのすべてのシナリオでRegexライブラリを使用して、部分正規表現をescape
関数で構築することができます。例えば
、正規表現のように定義することができ、完全一致:部分一致があることができた
exactMatcher typed =
caseInsensitive <| regex <| "^" ++ escape typed ++ "$"
:
partialMatcher =
caseInsensitive << regex << escape
あなたはpartialMatcherの正規表現を使用する場合は、あなたが返さMatchを使用することができますindex
値を使用して、文字列の深さを判定します。
入力された入力のバリエーション(例:"bul"
、"bu"
、"b"
)に対して部分一致を適用して、それをあなたの重み付けスコアに加えることさえできます。一日の終わりに
、あなたのソートアルゴリズムを使用しList.sortBy
とfst
を使用することができます。
List.sortBy (fst << assignWeight "bu") pokemon
をしかし、これはむしろ「妥当性」でそれらをソートするよりも、要素を削除し、リストをフィルタリングします。私は現在、単純な 'String.contains'を使用しています。これは何か類似しています。 –