Hvordan kunne en ægte vektortype implementeres i Haskell? For at noget skal være en vektor, skal det gemmes sekventielt i hukommelsen med O(1) tilfældig adgang. Men Haskell skjuler sin hukommelsesstyring, og dens datatyper beskriver træer! Så hvordan kunne du udtrykke den slags krav?

Kommentarer

  • Brug de matematiske definitioner til ægte vektorer. Her er ' et vektorrumsbibliotek til dig hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Hvor kommer disse krav til Vector fra? Jeg kender flere definitioner af udtrykket ' vektor ' og kun en af dem har sådanne krav (C ++ ' s std::vector).
  • Nogle strækker sig på samme måde som hvordan man gemmer en værdi i registret i f.eks. C eller C ++, eller hvis du er fri hukommelse i GC-sprog – kompilatoren er fri til at omarrangere data, placere værdierne i register osv. eller udsætte tingene ved (udvidelser) [ tinyurl.com/ovvxtqt] / [http://hackage.haskell.org/… til programmører, hvis de virkelig har brug for dem – men antagelsen er, at de ikke ' t plejer i de fleste tilfælde. På samme måde plejer Haskell-programmører ' i de fleste tilfælde ikke, om dataene pakkes i sekventiel hukommelsesregion i stedet for f.eks. At eliminere behovet for evaluering fuldstændigt.

Svar

Ikke alle datatyper i Haskell er træer. Der er også de indbyggede typer som funktioner eller Int. Blandt dem finder du typen Array , som giver dig O (1) adgang til dens elementer.

Nogle compilere, som GHC, giver også unboxed arrays. De bruger mindre hukommelse, og adgangen pr. Element er hurtigere, men det ændrer naturligvis ikke kompleksiteten.

Oven på disse arrays kan man oprette datatyper, der ligner std::vector i C ++. Et eksempel er vektor biblioteket.

Svar

Du skal se på Data.Vector.Unboxed og Data.Vector.Mutable i vektorpakken:

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *