Đây là mã mà tôi đã tìm thấy ở đâu đó nhưng muốn biết làm thế nào nó hoạt động:
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]
, nơi pred
là (==0)
& xs
là[1,2,0,3,0]
Tôi sẽ chỉ ra một số hiểu biết của tôi:
(zip [0..] xs)
Những gì dòng trên làm là đặt các chỉ số cho tất cả mọi thứ trong danh sách. Đối với đầu vào được đưa ra ở trên, nó sẽ trông như thế này : [(0,1),(1,2),(2,0),(3,3),(4,0)]
.
(pred . snd)
Tôi thấy rằng điều này có nghĩa là một cái gì đó như pred (snd (x))
. Câu hỏi của tôi là, x
danh sách được thực hiện từ zip
dòng? Tôi nghiêng về phía có nhưng dự đoán của tôi là mỏng manh.
Tiếp theo, là sự hiểu biết của tôi về fst
và snd
. tôi biết điều đó
fst(1,2) = 1
và
snd(1,2) = 2
Làm thế nào để hai lệnh này có ý nghĩa trong mã?
Sự hiểu biết của tôi filter
là nó trả về một danh sách các mục phù hợp với một điều kiện. Ví dụ,
listBiggerThen5 = filter (>5) [1,2,3,4,5,6,7,8,9,10]
sẽ cho [6,7,8,9,10]
Sự hiểu biết của tôi về bản đồ là nó áp dụng một chức năng cho mọi mục trong danh sách. Ví dụ,
times4 :: Int -> Int
times4 x = x * 4
listTimes4 = map times4 [1,2,3,4,5]
sẽ cho [4,8,12,16,20]
Làm thế nào để làm việc này tổng thể? Tôi nghĩ rằng tôi đã toàn diện trong những gì tôi biết cho đến nay nhưng không thể đặt các mảnh lại với nhau. Ai có thể giúp tôi không?