Прежде всего, если вам нужен индекс при обработке списка, это определенный признак того, что вы реализуете субоптимальный алгоритм, потому что список не является структурой на основе индексов, подобной массиву. Если вам нужно иметь дело с индексами, лучше использовать вместо этого 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')]
Наличие индексов в вашем распоряжении является довольно распространенным требованием при обработке списков (например, для сообщения об ошибках). –
Существует множество применений для индекса при обработке списка, который не имеет никакого отношения к использованию субоптимального алгоритма. Значит, это очень неопределенный знак. –