1

[a]変換できるものがあります[b]。それぞれaが異なりますが、それぞれでbはない場合があります。に変換したときに、フィルタリングされたものに重複が含まれていない[a]ことを条件に、my をフィルタリングしたい。[a][b]

誰かがこれを達成するのを手伝ってくれますか?

編集

補助として、例を挙げます。

as = [1..10]
conv = even
bs = map even as
-- bs = [False,True,False,True,False,True,False,True,False,True]
-- filter <cond> as -- [1,2]
4

2 に答える 2

9

を からにf変換する関数と仮定します。その後、次の 3 つの手順に進むことができます。ab

  1. リストの各要素を : の下の画像とペアにしfますmap (id &&& f)
  2. 2 番目の要素が現在取得されているリストに既に表示されているすべてのペアを削除しますnubBy (on (==) snd)
  3. 各ペアの 2 番目のコンポーネントをドロップしますmap fst

したがって:

import Control.Arrow ((&&&))
import Data.Function (on)
import Data.List (nubBy)

filterOn :: Eq b => (a -> b) -> [a] -> [a]
filterOn f = map fst . nubBy ((==) `on` snd) . map (id &&& f)

例えば:

> filterOn even [1 .. 10]
[1,2]
于 2012-08-13T10:23:23.753 に答える
1

これをcond :: a -> Bool関数だけfilterで行うことは(filter cond) [1..10]不可能[1,2]です。

問題はfilter、配列内の各要素を 1 回だけ見て、前の要素に関する情報がないことです。

于 2012-08-13T10:52:38.527 に答える