Einige gemeinsame performance advice in Haskell ist eine schnelle Datenstrukturen „Wirbelsäule streng“, so dass die Struktur, aber nicht unbedingt den Inhalt zu machen, ausgewertet wird vollständig, wie es erstellt wird. Dadurch können wir mehr arbeiten, wenn wir einen Wert einfügen, und die Struktur befindet sich im Cache, anstatt sie abzulegen, bis wir einen Wert nach oben sehen.Wie kann ich einen Vektor haben, der in seinen Werten streng ist, wie ein normaler Typ mit Pony (!)?
Bei einem normalen Datentyp, wie das binäre Trie von Data.IntMap kann diese strenge, indem sie die entsprechenden Felder in der Datenstruktur erreicht werden: (. Auszug aus dem Data.IntMap.Base Quelle)
data IntMap a = Bin {- ... -} !(IntMap a) !(IntMap a)
| {- ... -}
Wie kann ich das gleiche Verhalten erreichen, wenn ich die Kinder in einem Vektor statt direkt als Felder von Bin
speichern möchte?
data IntMap a = Bin {- ... -} (Vector (IntMap a))
| {- ... -}
Könnte ein 'Data.Vector.Strict' Modul oben auf dem regelmäßigen gebaut werden ? Ich konnte keine vorgefertigte Version im Hacker finden. – chi
Mit Blick auf die gemeinsame API in [ 'Data.Vector.Generic.Mutable'] (https://hackage.haskell.org/package/vector-0.11.0.0/docs/Data-Vector-Generic-Mutable.html) I finde eine Methode 'basicClear', die intuitiv für strikte Vektoren beliebigen Elementtyps zu implementieren ist (es gibt keinen polymorphen strikten Wert, auf den zurückgesetzt werden soll). Ich weiß nicht, wie wichtig es ist ... –
Randbemerkung: In Datenstrukturen würde ich höchstwahrscheinlich 'Data.Primitive.Array' anstelle von' Vector' verwenden, da es wahrscheinlich keinen Bedarf für Slicing gibt und daher auch nicht nötig ist die zusätzlichen zwei Wörter pro Knoten. –