6

1年以上の精神的な騒ぎの後、私は最終的に私の一般的なプログラミングの必要性の大半のためにそれを私の主要な言語と見なすことができます。私は絶対にそれを愛する。Haskellと機能的にデータセットを比較する

しかし、私はまだ機能的な方法で非常に特定の操作を行うことに苦労しています。

簡単な例:

Set = [("Bob", 10), ("Megan", 7), ("Frank", 2), ("Jane", 11)] 

私はお互いにこれらのエントリを比較したいと思います。 CやPythonのような言語では、おそらく複雑なループを作成するでしょうが、どのアプローチ(map、fold、list comprehension?)が関数型言語でもっとも効率的であるかわかりません。ここで

は、私が仕事を始めたコードのサンプルです:

run xs = [ someAlgorithm (snd x) (snd y) | x <- xs, y <- xs, x /= y ] 

述語が自分自身でエントリを比較するから、リスト内包を保持しますが、それはすでにされているエントリを比較するための機能は非常に効率的ではありません比較した。例えば。 BobとMeganを比較し、MeganとBobを比較します。

この問題の解決方法についてアドバイスをいただければ幸いです。

+0

あなたはそれらを比較したいと言っていますが、比較の結果で何をしたいのかは分かりません。あなたのサンプルから、あなたはリストから2つの異なる要素のすべての選択肢を見たいと思うようです。それですか? –

+0

はい、ただし「逆」の選択はできません。私はBobとMegan、BobとFrank、BobとJane、そしてMeganとFrank、MeganとJane、そしてFrankとJaneを比較したいと思います。これは折り畳みで行うことができるもののように見えますが、わかりません。 –

答えて

8

データタイプをご注文の場合は、x /= yの代わりにx < yを使用してください。

別のアプローチは、同じ位置の要素を比較することを回避するためにtailsを使用することである。

[ ... | (x:ys) <- tails xs, y <- ys] 

これは、元のリストにx後に発生するアイテムyをピッキングする効果を有します。あなたのリストに重複が含まれている場合は、これを以前の明示的なフィルタリングと組み合わせてください。

+0

OPは順序を無視してすべてのペアを調べたいと思われるので、ソートは役に立たないと思う - 必然的にn ** 2の問題のように思える。私は正しい答えだと思います。 –

+0

@JameySharp:はい、私はその1つの脳のおならが少しありました。既にその部分を削除しました:) – hammar

+0

そのような簡潔な解決策!あなたの時間と助けをありがとう、ありがとう。 –

関連する問題