Hvordan kan en ekte Vektortype implementeres i Haskell? For at noe skal være en Vector, må det lagres sekvensielt i minnet, med O(1) tilfeldig tilgang. Men Haskell skjuler minnehåndteringen, og datatypene beskriver trær! Så hvordan kan du uttrykke den slags krav?

Kommentarer

  • Bruk de matematiske definisjonene for sanne vektorer. Her er ' et vektorromsbibliotek for deg hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Hvor kommer disse kravene til Vector fra? Jeg kjenner flere definisjoner av begrepet ' vektor ' og bare en av dem har slike krav (C ++ ' s std::vector).
  • Noen utvider på samme måte som hvordan du lagrer en verdi i registeret i si C eller C ++, eller du frigjør minne i GC-språk – kompilatoren er fri til å omorganisere data, sette verdiene i register osv. eller eksponere tingene med (utvidelser) [ tinyurl.com/ovvxtqt ]/(libraries) [http://hackage.haskell.org/… til programmerere hvis de virkelig trenger dem – men antagelsen er at de ikke bryr seg ' i de fleste tilfeller. På lignende måte bryr Haskell-programmerere seg ikke ' i de fleste tilfeller om dataene er pakket i sekvensielt minneområde i stedet for for eksempel å eliminere behovet for evaluering helt.

Svar

Ikke alle datatyper i Haskell er trær. Det er også de innebygde typene som funksjoner eller Int. Blant dem finner du typen Array som gir deg O (1) tilgang til elementene.

Noen kompilatorer, som GHC, gir også unboxed arrays. De bruker mindre minne og tilgang per element er raskere, men det endrer selvfølgelig ikke kompleksiteten.

På toppen av disse matriser kan man bygge datatyper som ligner std::vector i C ++. Et eksempel er vektor -biblioteket.

Svar

Du bør se på Data.Vector.Unboxed og Data.Vector.Mutable i vektorpakken:

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

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *