2013-04-24 5 views
13

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

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

ответ

26

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

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

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

Наличие индексов в вашем распоряжении является довольно распространенным требованием при обработке списков (например, для сообщения об ошибках). –

+8

Существует множество применений для индекса при обработке списка, который не имеет никакого отношения к использованию субоптимального алгоритма. Значит, это очень неопределенный знак. –

27

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

-- 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

Или 'mapInd f l = zipWith f l [0 ..]'. – dave4420

+0

@ dave4420: хороший пункт, спасибо. –

+2

Это было давно, но для краткости это тоже работает: 'mapInd f = zipWith f [0 ..]' – Kittsil

Смежные вопросы