Подтвердить что ты не робот

Индекс элемента в списке в Haskell

Как я могу получить индекс элемента, который я нахожу в haskell, когда я использую карту?

Например, у меня есть этот список l = "a+bc?|(de)*fg|h", и я хочу знать точный индекс элемента, которым я являюсь, когда я использую функцию map or scanl.

4b9b3361

Ответ 1

Прежде всего, если вам нужен индекс при обработке списка, это определенный признак того, что вы реализуете субоптимальный алгоритм, потому что список не является основанной на индексе структурой, подобной массиву. Если вам нужно иметь дело с индексами, лучше подумайте об использовании vector.

Что касается вашего фактического вопроса, вы можете связать элементы своего списка с инкрементными ints с помощью следующего кода, а затем отобразить результат:

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')]

Ответ 2

Изменив ответ Никиты Волкова, вы можете использовать такую ​​функцию, как:

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