นี่คือรหัสที่ฉันเข้ามาบางที่ แต่ต้องการทราบวิธีการทำงาน:
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 เป็นรายการที่ทำจากเส้นซิปหรือไม่ ฉันเอนไปทางใช่ แต่การคาดเดาของฉันนั้นบอบบาง
ต่อไปคือความเข้าใจของฉันของ 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]
สิ่งนี้ทำงานโดยรวมอย่างไร ฉันคิดว่าฉันได้รับการครอบคลุมในสิ่งที่ฉันรู้จนถึง แต่ไม่สามารถรวบรวมกัน ใครช่วยฉันออกได้ไหม