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 pred
adalah (==0)
& xs
adalah[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 x
daftar dibuat dari zip
garis? Saya condong ke arah ya tapi dugaan saya lemah.
Selanjutnya, adalah pemahaman saya tentang fst
dan snd
. saya tahu itu
fst(1,2) = 1
dan
snd(1,2) = 2
Bagaimana kedua perintah ini masuk akal dalam kode?
Pemahaman saya filter
adalah 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?