Dies ist der Code, auf den ich irgendwo gestoßen bin, aber ich möchte wissen, wie das funktioniert:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Ausgabe: findIndices (== 0) [1,2,0,3,0] == [2,4] , wobei pred (== 0) & xs [1,2,0,3,0] ist
Ich werde etwas von meinem Verständnis zeigen:
(zip [0..] xs)
In der obigen Zeile werden Indizes für alle Elemente in der Liste angezeigt. Für die oben angegebene Eingabe würde dies folgendermaßen aussehen: [(0,1), (1,2), (2,0), (3,3), (4,0)]
(pred . snd)
Ich fand, dass dies so etwas wie pred (snd (x)) bedeutet. Meine Frage ist, ist x die Liste aus der Postleitzahl? Ich neige mich zu Ja, aber meine Vermutung ist schwach.
Als nächstes ist mein Verständnis von fst und snd. ich weiß das
fst(1,2) = 1
und
snd(1,2) = 2
Wie machen diese beiden Befehle im Code Sinn?
Mein Verständnis von Filter ist, dass es eine Liste von Elementen zurückgibt, die einer Bedingung entsprechen. Zum Beispiel,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
würde geben [6,7,8,9,10]
Mein Verständnis von Map ist, dass es eine Funktion auf jedes Element in der Liste anwendet. Zum Beispiel,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
würde geben [4,8,12,16,20]
Wie funktioniert das insgesamt? Ich glaube, ich war umfassend in dem, was ich bisher weiß, kann die Teile aber nicht ganz zusammenfügen. Kann mir jemand helfen?