Jak można zaimplementować prawdziwy typ wektorowy w Haskell? Aby coś było wektorem, musi być przechowywane w pamięci sekwencyjnie, z O(1) dostępem swobodnym. Ale Haskell ukrywa zarządzanie pamięcią, a jego typy danych opisują drzewa! Jak więc możesz wyrazić tego rodzaju wymaganie?

Komentarze

  • Użyj definicji matematycznych dla prawdziwych wektorów. Tutaj ' jest biblioteką przestrzeni wektorowej dla Ciebie hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Skąd się biorą te wymagania dla Vector? Znam wiele definicji terminu ' wektor ' i tylko jedna z nich ma takie wymagania (C ++ ' s std::vector).
  • Do pewnego stopnia w taki sam sposób, jak przechowywanie wartości w rejestrze w, powiedzmy C lub C ++, albo za darmo pamięć w języku GC – kompilator może swobodnie przestawiać dane, umieszczać wartości w rejestrze itp. lub eksponować rzeczy przez (rozszerzenia) [ tinyurl.com/ovvxtqt]/(libraries) [http://hackage.haskell.org/… programistom, jeśli naprawdę ich potrzebują – ale zakłada się, że w większości przypadków nie ' im to nie przeszkadza. W podobny sposób programiści Haskell nie ' nie przejmują się w większości przypadków, jeśli dane są pakowane w sekwencyjny region pamięci zamiast, na przykład całkowicie eliminując potrzebę oceny.

Odpowiedź

Nie wszystkie typy danych w Haskell są drzewami. Istnieją również typy wbudowane, takie jak funkcje lub Int. Wśród nich znajdziesz typ Array , który daje dostęp O (1) do jej elementów.

Niektóre kompilatory, takie jak GHC, również zapewniają tablice rozpakowane. Zużywają one mniej pamięci, a dostęp do każdego elementu jest szybszy, ale to oczywiście nie zmienia złożoności.

Oprócz tych tablic można budować typy danych podobne do std::vector w C ++. Przykładem jest biblioteka wektorów .

Odpowiedź

Powinieneś spojrzeć na Data.Vector.Unboxed i Data.Vector.Mutable w pakiecie wektorowym:

https://hackage.haskell.org/package/vector

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *