Ini adalah kode yang saya temukan di suatu tempat tetapi ingin tahu cara kerjanya:
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] , di mana predadalah (==0)& xsadalah[1,2,0,3,0]
Saya akan menunjukkan beberapa pemahaman saya:
(zip [0..] xs)
Apa yang dilakukan oleh baris di atas adalah meletakkan indeks pada semua yang ada dalam daftar. Untuk input yang diberikan di atas, akan terlihat seperti ini: [(0,1),(1,2),(2,0),(3,3),(4,0)].
(pred . snd)
Saya menemukan bahwa ini berarti sesuatu seperti pred (snd (x)). Pertanyaan saya adalah, apakah xdaftar dibuat dari zipgaris? Saya condong ke arah ya tapi dugaan saya lemah.
Selanjutnya, adalah pemahaman saya tentang fstdan snd. saya tahu itu
fst(1,2) = 1
dan
snd(1,2) = 2
Bagaimana kedua perintah ini masuk akal dalam kode?
Pemahaman saya filteradalah bahwa ia mengembalikan daftar item yang cocok dengan suatu kondisi. Contohnya,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
akan memberi [6,7,8,9,10]
Pemahaman saya tentang peta adalah bahwa ia menerapkan fungsi untuk setiap item dalam daftar. Contohnya,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
akan memberi [4,8,12,16,20]
Bagaimana cara kerjanya secara keseluruhan? Saya pikir saya telah komprehensif dalam apa yang saya ketahui sejauh ini tetapi tidak bisa menyatukan potongan-potongan itu. Adakah yang bisa membantu saya?