Ответ 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')]