Come potrebbe essere implementato un vero tipo Vector in Haskell? Affinché qualcosa sia un vettore, deve essere archiviato sequenzialmente in memoria, con O(1) accesso casuale. Ma Haskell nasconde la sua gestione della memoria ei suoi tipi di dati descrivono gli alberi! Allora, come potresti esprimere questo tipo di requisito?

Commenti

  • Usa le definizioni matematiche per i veri vettori. Qui ' una libreria di spazi vettoriali per te hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Da dove vengono questi requisiti per Vector? Conosco più definizioni del termine ' vector ' e solo una di esse ha tali requisiti (C ++ ' s std::vector).
  • Per alcuni si estendono nello stesso modo in cui si memorizza un valore nel registro in C o C ++, oppure si libera memoria in linguaggio GC – il compilatore è libero di riorganizzare i dati, inserire i valori nel registro ecc. o esporre le cose con (extensions) [ tinyurl.com/ovvxtqt”/(librerie) [http://hackage.haskell.org/… ai programmatori se ne hanno davvero bisogno, ma il presupposto è che ' non si preoccupano nella maggior parte dei casi. In modo simile, i programmatori Haskell non ' si preoccupano nella maggior parte dei casi se i dati sono impacchettati in una regione sequenziale di memoria invece di, ad esempio, eliminare completamente la necessità di valutazione.

Risposta

Non tutti i tipi di dati in Haskell sono alberi. Ci sono anche i tipi incorporati come functions o Int. Tra questi trovi il tipo Array che ti dà accesso O (1) ai suoi elementi.

Alcuni compilatori, come GHC, forniscono anche array unboxed. Quelli utilizzano meno memoria e laccesso per elemento è più veloce, ma ovviamente ciò non cambia la complessità.

Oltre a questi array si possono creare tipi di dati simili a std::vector in C ++. Un esempio è la libreria vector .

Answer

Dovresti esaminare Data.Vector.Unboxed e Data.Vector.Mutable nel pacchetto vettoriale:

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *