6

1年以上のメンタルラングリングの後、私はついにHaskellを十分に理解し、私の一般的なプログラミングニーズの大部分を母国語と見なすことができました。私は絶対にそれが大好きです。

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

簡単な例:

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

これらのエントリを相互に比較したいと思います。CやPythonのような言語では、おそらく複雑なループを作成しますが、関数型言語でどちらのアプローチ(マップ、フォールド、リスト内包)が最適か、最も効率的かはわかりません。

これが私が取り組み始めたコードのサンプルです:

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

述部は、リスト内包がエントリをそれ自体と比較することを防ぎますが、すでに比較されたエントリを比較するため、この関数はあまり効率的ではありません。例えば。ボブとミーガンを比較してから、ミーガンとボブを比較します。

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

4

1 に答える 1

8

データ型に順序がある場合は、のx < y代わりに使用できますx /= y

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

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

これには、元のリストのy後に発生するアイテムのみを選択する効果があります。xリストに重複が含まれている場合は、これを以前の明示的なフィルタリングと組み合わせる必要があります。

于 2012-11-13T17:38:52.637 に答える