2013-04-24 72 views
13

Làm cách nào tôi có thể lấy chỉ mục của phần tử tôi đang ở trong haskell khi tôi đang sử dụng bản đồ?Chỉ mục của phần tử trong danh sách trong Haskell

Ví dụ: tôi có danh sách này l = "a+bc?|(de)*fg|h" và tôi muốn biết chỉ mục chính xác của phần tử tôi đang sử dụng khi tôi sử dụng chức năng map or scanl.

Trả lời

26

Trước hết, nếu bạn cần chỉ mục khi xử lý danh sách, đó là dấu hiệu nhất định bạn đang triển khai thuật toán tối ưu, vì danh sách không phải là cấu trúc dựa trên chỉ mục như mảng. Nếu bạn cần xử lý các chỉ mục, bạn nên cân nhắc sử dụng một số vector thay thế.

Về câu hỏi thực tế của bạn, bạn có thể ghép các mục trong danh sách của bạn với incrementing ints với đoạn mã sau và sau đó bản đồ so với kết quả:

Prelude> zip [0..] "a+bc?|(de)*fg|h" :: [(Int, Char)] 
[(0,'a'),(1,'+'),(2,'b'),(3,'c'),(4,'?'),(5,'|'),(6,'('),(7,'d'),(8,'e'),(9,')'),(10,'*'),(11,'f'),(12,'g'),(13,'|'),(14,'h')] 
+10

Có chỉ mục theo yêu cầu của bạn là yêu cầu khá phổ biến khi xử lý danh sách (ví dụ: để báo cáo lỗi). –

+8

Có nhiều cách sử dụng cho một chỉ mục khi xử lý một danh sách không liên quan gì đến việc sử dụng một thuật toán tối ưu. Vì vậy, đó là một dấu hiệu rất không chắc chắn. –

27

Sửa đổi câu trả lời Nikita Volkov, bạn có thể sử dụng một chức năng như :

-- variant of map that passes each element's index as a second argument to f 
mapInd :: (a -> Int -> b) -> [a] -> [b] 
mapInd f l = zipWith f l [0..] 
+3

Hoặc 'mapInd f l = zipVới f l [0 ..]'. – dave4420

+0

@ dave4420: điểm tốt, cảm ơn. –

+2

Đó là một thời gian dài, nhưng cho ngắn gọn, điều này cũng hoạt động: 'mapInd f = zipVới f [0 ..]' – Kittsil

Các vấn đề liên quan