Это код, который я где-то нашел, но хочу знать, как это работает:
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
is (==0)
& xs
is [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
? Я склоняюсь к да, но мое предположение ненадежно.
Далее, мое понимание fst
и snd
. Я знаю, что
fst(1,2) = 1
и
snd(1,2) = 2
Как эти две команды имеют смысл в коде?
Мое понимание filter
состоит в том, что он возвращает список предметов, которые соответствуют условию. Например,
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]
Как это работает в целом? Я думаю, что я был всесторонним в том, что я знаю до сих пор, но не могу собрать все воедино. Кто-нибудь может мне помочь?