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 è: xl'elenco è fatto dalla zipriga? Mi sto inclinando verso sì ma la mia ipotesi è fragile.
Successivamente, è la mia comprensione di fste 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?