2013-04-24 13 views
13

Jak mogę uzyskać indeks elementu, w którym się znajduję w haskell, kiedy używam mapy?Indeks elementu na liście w Haskell

Na przykład mam tę listę l = "a+bc?|(de)*fg|h" i chcę znać dokładny indeks elementu jestem przy użyciu funkcji map or scanl.

Odpowiedz

26

Po pierwsze, jeśli potrzebujesz indeksu podczas przetwarzania listy, jest to pewny znak, że wdrażasz nieoptymalny algorytm, ponieważ lista nie jest strukturą opartą na indeksie, taką jak tablica. Jeśli chcesz zajmować się indeksami, lepiej zamiast tego użyj opcji vector.

chodzi rzeczywisty pytanie, można powiązać pozycje listy z zwiększając ints z następującego kodu, a następnie map na skutek:

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

Posiadanie indeksów do Państwa dyspozycji jest dość powszechnym wymogiem podczas przetwarzania list (np. Do zgłaszania błędów). –

+8

Istnieje wiele zastosowań indeksu podczas przetwarzania listy, która nie ma nic wspólnego z użyciem nieoptymalnego algorytmu. Jest to bardzo niepewny znak. –

27

zmianie odpowiedź Nikity Volkov, można użyć funkcji, takich jak :

+3

Lub 'mapInd f l = zipW przypadku f l [0 ..]'. – dave4420

+0

@ dave4420: dobry punkt, dzięki. –

+2

Minęło dużo czasu, ale dla zwięzłości, działa to również: 'mapInd f = zipWith f [0 ..]' – Kittsil

Powiązane problemy