Este es el código que encontré en alguna parte, pero quiero saber cómo funciona esto:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Salida: findIndices (== 0) [1,2,0,3,0]
==[2,4]
, donde pred
es (==0)
y xs
es[1,2,0,3,0]
Mostraré algo de mi comprensión:
(zip [0..] xs)
Lo que hace la línea anterior es poner índices a todo en la lista. Para la entrada dada anteriormente, sería el siguiente: [(0,1),(1,2),(2,0),(3,3),(4,0)]
.
(pred . snd)
Descubrí que esto significa algo así pred (snd (x))
. Mi pregunta es, ¿ x
la lista está hecha desde la zip
línea? Me estoy inclinando hacia sí, pero mi suposición es débil.
A continuación, es mi comprensión de fst
y snd
. Yo sé eso
fst(1,2) = 1
y
snd(1,2) = 2
¿Cómo tienen sentido estos dos comandos en el código?
Entiendo filter
que devuelve una lista de elementos que coinciden con una condición. Por ejemplo,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
daría [6,7,8,9,10]
Según tengo entendido, map aplica una función a cada elemento de la lista. Por ejemplo,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
daría [4,8,12,16,20]
¿Cómo funciona esto en general? Creo que he sido comprensivo en lo que sé hasta ahora, pero no puedo armar las piezas. ¿Alguien puede ayudarme?