Was ich versuche zu erreichen, zwei Listen von Tupeln mit ((==) `on` fst)
und aus den Paaren zu vergleichen, die dieses Prädikat erfüllen, diejenigen auszuwählen, die erfüllen (min `on` snd)
Wie kann ich Elemente aus zwei Listen nach einem Prädikat vergleichen und entsprechend auswählen?
Antwort
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)]
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
Guter Punkt. Ich habe meine Implementierung geändert, um 'foldr' zu verwenden, obwohl das, was Sie eingefügt haben, besser/prägnanter ist. – mnoronha
Was ist die Bimap-Funktion, die Sie verwenden? – mnoronha
Ich werde davon ausgehen, dass ...
zu vergleichenWas ich versuche zu Erzielen ist es, zwei Listen von Tupeln mit
((==) `on` fst)
... 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.
- 1. Elemente aus zwei Listen in Python vergleichen
- 2. Cover-Prädikat für zwei Listen
- 3. kann nicht iterieren und vergleichen zwei Listen
- 4. Wie kann ich zwei Listen in Groovy vergleichen
- 5. LINQ zwei Listen vergleichen und entfernen
- 6. Vergleichen von zwei Listen nach dem Parse von einem Verzeichnis
- 7. übereinstimmende Elemente aus zwei Listen (oder Arrays)
- 8. Vergleichen von Elementen aus zwei verschiedenen Listen
- 9. Wie kann ich Elemente in zwei Listen vergleichen, die an derselben Stelle vorkommen?
- 10. Wie kann ich zwei geordnete Listen in Python vergleichen?
- 11. Vergleichen von zwei Listen C#
- 12. Vergleichen von zwei Listen für eindeutige Elemente in jedem
- 13. Vergleichen Sie zwei Listen, um allgemeine Elemente zu suchen
- 14. Vergleichen von zwei Listen von Listen mit verschiedenen Größen
- 15. Entfernen Sie die Elemente aus zwei Listen
- 16. zufälliges Auswählen Elemente aus einem Array Python
- 17. zwei Listen vergleichen und von einem Feld suchen, Python
- 18. Vergleichen Sie Elemente von zwei verschiedenen Arten von Listen C#
- 19. Vergleichen Sie zwei Listen nach Elementen und geben Sie die dritte Liste Elemente Unterschied
- 20. Wie kann ich Elemente aus einer Liste von Listen in Python vergleichen
- 21. Effiziente Möglichkeit, Elemente in zwei Listen zu vergleichen?
- 22. wie takeFirst Element nach einem Prädikat in scala
- 23. R: Elemente auswählen, die Kriterien aus einem Vektor entsprechen
- 24. Wie zwei Listen unterschiedlicher Größe zu vergleichen und gemeinsame Datensätze aus beiden Listen zurückgeben ... in Java
- 25. Inhalt von zwei Listen vergleichen
- 26. Vergleichen Sie zwei Array-Elemente
- 27. Wie Elemente aus zwei Werten zu vergleichen? (pareto optimum)
- 28. Vergleichen Sie zwei verschiedene Listen
- 29. Wie zwei Listen in Haskell zu vergleichen?
- 30. Vergleichen Sie zwei Listen für Updates, Löschungen und Ergänzungen
Auschecken ['Data.List'] (https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-List.html). Du suchst nach 'groupBy' und' minimumBy'. – crockeea