2011-11-04 6 views
5

Widzę, że można zamiast tego pisać funkcje takie jak map/sortBy/findIndex i inne funkcje związane z Listami (przynajmniej te indeksowane przez liczby całkowite). Czy dzieje się to w dowolnym miejscu w standardowej bibliotece, czy też muszę wykonać własne?Haskell map/sortBy/findIndex itp. Dla tablic zamiast list

Potrzebuję użyć tablicy w moim programie do aktualizacji w miejscu, ale jest też kilka lokalizacji, w których chciałbym użyć niektórych z powyższych funkcji list na nim. Czy konwersja pomiędzy tymi dwoma najlepszymi rozwiązaniami?

(Macierze Szukałem na to z Data.Array.IArray. Jestem też zadowolony zastosować jakiś inny biblioteki tablicy, która implementuje tej funkcji.)

+0

"Potrzebuję użyć tablicy w moim programie do aktualizacji w miejscu" - aktualizacja na miejscu jest szczegółem wdrożenia ... dlaczego * naprawdę * potrzebujesz tablic? Ograniczenia przestrzeni? Ograniczenia czasowe? Próbujesz wdrożyć algorytm, który zależy od aktualizacji w miejscu? –

+0

Masz rację, to było źle sformułowane. Chciałbym móc łatwo zaktualizować element na danym indeksie n. Oczywiście, mogę napisać funkcję, aby zrobić to dla listy, ale ogólnie jest ona nieskuteczna i nie mogę znaleźć domyślnej implementacji, więc nie wydaje się "Haskellish". Zastanawiam się, jaka była struktura danych "Haskellish", która zapewniała funkcjonalność podobną do listy, ale z wydajnym wbudowanym update-by-index. –

+0

powinieneś sprawdzić [Data.Sequence] (http://hackage.haskell.org/packages/archive/containers/latest/doc/html/Data-Sequence.html). –

Odpowiedz

5

polecam rzucić okiem Pod Pakiety vector i vector-algorithms. Zawierają one bardzo wydajne implementacje wielu popularnych operacji na tablicach indeksowanych, zarówno w wariantach zmiennych, jak i niezmiennych.

+0

Niesamowite, tego właśnie szukałem. Znalazłem również Data.Sequence, czy wiesz, jak te porównania? –

+0

@CoreyStaten musimy być na tym samym fal mózgowych. Właśnie zapytałem [Czy Data.Vector zastępuje Data.Sequence?] (Http://stackoverflow.com/questions/8013275/does-data-vector-replace-data-sequence) –

+1

@CoreyStaten: Data.Sequence jest zaimplementowana jako palcem, a Data.Vector jest tablicą "prawdziwą". Jako taki, Data.Vector obsługuje stałe indeksowanie czasu i zwykle ma mniej narzutów, podczas gdy Data.Sequence obsługuje ciągłą manipulację czasową na końcach i jest bardziej odpowiedni dla operacji podobnych do kolejek. – hammar

4

fmap (od Control.Monad) to rodzaj jakby generycznej wersji map który działa na wszystko, co wspiera klasę Functor typu. Array obsługuje to, więc powinieneś być w stanie użyć fmap zamiast map dla tablicy.

Jak głosi hammar, algorytmy wektorowe i wektorowe są prawdopodobnie lepszym sposobem na rozwiązanie problemu, jeśli zajdzie potrzeba rozważenia tablic indeksowanych.

Powiązane problemy