Questo è il codice che ho trovato da qualche parte, ma voglio sapere come funziona:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Output: findIndices (== 0) [1,2,0,3,0]
==[2,4]
, dove pred
è (==0)
& xs
è[1,2,0,3,0]
Mostrerò un po 'della mia comprensione:
(zip [0..] xs)
Quello che fa la riga sopra è mettere gli indici in tutto l'elenco. Per l'ingresso di cui sopra, sarebbe simile a questa: [(0,1),(1,2),(2,0),(3,3),(4,0)]
.
(pred . snd)
Ho scoperto che questo significa qualcosa di simile pred (snd (x))
. La mia domanda è: x
l'elenco è fatto dalla zip
riga? Mi sto inclinando verso sì ma la mia ipotesi è fragile.
Successivamente, è la mia comprensione di fst
e snd
. lo so
fst(1,2) = 1
e
snd(1,2) = 2
Come hanno senso questi due comandi nel codice?
La mia comprensione filter
è che restituisce un elenco di elementi che corrispondono a una condizione. Per esempio,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
darebbe [6,7,8,9,10]
La mia comprensione della mappa è che applica una funzione a tutti gli elementi dell'elenco. Per esempio,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
darebbe [4,8,12,16,20]
Come funziona nel complesso? Penso di essere stato completo in quello che so finora, ma non riesco a mettere insieme i pezzi. Qualcuno può darmi una mano?