2016-10-30 5 views

Antwort

1

Um einen allgemeinen Fall zu lösen, können Sie modifizierte Version des Filters definieren Dieses Muster stimmt mit einem Tupel überein, das zwei Vergleichselemente enthält, und prüft, ob beide erfüllt sind.

filter' :: ((a->Bool),(a->Bool)) -> [(a,a)] -> [(a,a)] 
filter' (pred1,pred2) = foldr f [] 
where f = (\x acc -> if pred1 $ fst x then 
             if pred2 $ snd x then x : acc 
             else acc 
         else acc 
      ) 

, die eine Liste [(1,2),(2,2),(3,3),(3,4)] mit dem ersten Prädikat odd und das zweite Prädikat even wie bewerten würde:

>> filter' (odd,even) [(1,2),(2,2),(3,3),(3,4)] 
[(1,2),(3,4)] 
+2

Es ist keine gute Idee, eine Liste mit 'foldl' durch Anhängen einzelner Elemente mit' (++) 'zu erstellen. Verwenden Sie stattdessen 'foldr' und' (:) '. Außerdem muss das Ganze nicht neu implementiert werden. Sie können 'filter' einfach wiederverwenden, mit etwas wie' filter 'p q = filter (uncurry (&&). Bimap p q) '. – duplode

+0

Guter Punkt. Ich habe meine Implementierung geändert, um 'foldr' zu verwenden, obwohl das, was Sie eingefügt haben, besser/prägnanter ist. – mnoronha

+0

Was ist die Bimap-Funktion, die Sie verwenden? – mnoronha

2

Ich werde davon ausgehen, dass ...

Was ich versuche zu Erzielen ist es, zwei Listen von Tupeln mit ((==) `on` fst)

zu vergleichen

... bedeutet, jedes Paar in einer Liste mit dem entsprechenden Paar in der anderen Liste zu vergleichen, wie im üblichen (==) für Listen.

Hier ist ein meist pointfree (und vielleicht etwas verschroben) Lösung, die nah an Ihrem ursprünglichen Vorschläge bleibt:

-- Suggestions of sensible names for this are welcome. 
yourSelector :: (Eq a, Ord b) => [(a, b)] -> [(a, b)] -> [(a, b)] 
yourSelector ps = fmap (minBy' snd) 
    . filter (uncurry ((==) `on` fst)) . zip ps 
    where 
    minBy' f (x, y) = case (compare `on` f) x y of 
     LT -> x 
     _ -> y 
GHCi> yourSelector [(1,2),(3,5),(4,7)] [(1,3),(2,2),(4,9)] 
[(1,2),(4,7)] 

Für alternative Möglichkeiten des Schreibens minBy', vgl Maximizing according to a function.

Verwandte Themen