Bu bir yere geldi ama bunun nasıl çalıştığını bilmek istiyorum kodu:
findIndices :: (a -> Bool) -> [a] -> [Int]
findIndices _ [] = []
findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs))
Çıktı: findIndices (== 0) [1,2,0,3,0] == [2,4] ; burada pred (== 0) ve xs [1,2,0,3,0]
Bazı anlayışlarımı göstereceğim:
(zip [0..] xs)
Yukarıdaki satırın yaptığı şey, listedeki her şeye endeks koymaktır. Yukarıda verilen girdi için şöyle görünecektir: [(0,1), (1,2), (2,0), (3,3), (4,0)]
(pred . snd)
Bunun pred (snd (x)) gibi bir şey ifade ettiğini buldum. Benim sorum, x listesi zip satırından mı yapılmış? Evet yöneliyorum ama tahminim dayanıksız.
Sonra, benim fst ve snd anlayışım. bunu biliyorum
fst(1,2) = 1
ve
snd(1,2) = 2
Bu 2 komut kodda nasıl bir anlam ifade ediyor?
Filtre anlayışım, bir koşulla eşleşen öğelerin bir listesini döndürmesidir. Örneğin,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
verecek [6,7,8,9,10]
Haritaya ilişkin anlayışım, listedeki her öğeye bir işlev uygulamasıdır. Örneğin,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
verecek [4,8,12,16,20]
Bu genel olarak nasıl çalışıyor? Sanırım şimdiye kadar bildiklerimde kapsamlı olduğumu ancak parçaları bir araya getiremediğimi düşünüyorum. Biri bana yardım edebilir mi?