Jedną z powszechnych wartości performance advice w Haskell jest tworzenie szybkich struktur danych, tak aby struktura, ale niekoniecznie jej zawartość, była w pełni oszacowana w momencie jej utworzenia. Dzięki temu możemy wykonać więcej pracy, gdy wstawimy wartość, a struktura jest w pamięci podręcznej, a nie odkładaniu jej, dopóki nie spojrzymy na wartość.Jak mogę mieć wektor, który jest ściśle zgodny z jego wartościami, jak normalny typ z grzywką (!)?
Z normalnego typu danych, takich jak binarny trie od Data.IntMap, można to osiągnąć przez wykonanie odpowiednich pól w strukturze danych ścisłym: (. Wyciąg ze źródła Data.IntMap.Base)
data IntMap a = Bin {- ... -} !(IntMap a) !(IntMap a)
| {- ... -}
Jak osiągnąć to samo zachowanie, jeśli chcę przechowywać dzieci w wektorze, a nie bezpośrednio jako pola Bin
?
data IntMap a = Bin {- ... -} (Vector (IntMap a))
| {- ... -}
Could od 'Data.Vector.Strict' Moduł zbudowany na szczycie jednej regularnej ? Nie mogłem znaleźć żadnego paczkowanego w hackage. – chi
Przeglądanie wspólnego API w ['Data.Vector.Generic.Mutable'] (https://hackage.haskell.org/package/vector-0.11.0.0/docs/Data-Vector-Generic-Mutable.html) I znajdź jedną metodę "basicClear", która wydaje się intuicyjnie niemożliwa do zaimplementowania dla ścisłych wektorów dowolnego typu elementu (nie ma polimorficznej ścisłej wartości do zresetowania). Nie wiem, jak ważne jest to ... –
Nota boczna: wewnątrz struktur danych Najprawdopodobniej użyłbym "Data.Primitive.Array" zamiast "Vector", ponieważ prawdopodobnie nie ma potrzeby krojenia, a zatem nie ma potrzeby dodatkowe dwa słowa na węzeł. –