Це код, який я десь натрапив, але хочу знати, як це працює:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Вихід: findIndices (== 0) [1,2,0,3,0] == [2,4] , де pred є (== 0) & xs є [1,2,0,3,0]
Я покажу своє розуміння:
(zip [0..] xs)
Що робиться у вищевказаному рядку, це ставити індекси до всього у списку. Для наведеного вище входу він виглядатиме так: [(0,1), (1,2), (2,0), (3,3), (4,0)]
(pred . snd)
Я виявив, що це означає щось на кшталт pred (snd (x)). Моє запитання, чи x список складається із zip line? Я схиляюся до так, але я здогадуюсь надуманий.
Далі - моє розуміння fst та snd. я знаю це
fst(1,2) = 1
і
snd(1,2) = 2
Як ці 2 команди мають сенс у коді?
Я розумію, що фільтр полягає в тому, що він повертає список елементів, які відповідають умові. Наприклад,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
дасть [6,7,8,9,10]
Я розумію карту, що вона застосовує функцію до кожного елемента списку. Наприклад,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
дасть [4,8,12,16,20]
Як це працює в цілому? Я думаю, що я був всеосяжним у тому, що знаю досі, але не можу цілком скласти шматки. Хтось може мені допомогти?