Hur kunde en riktig vektortyp implementeras i Haskell? För att något ska kunna vara en vektor måste det lagras sekventiellt i minnet med O(1) slumpmässig åtkomst. Men Haskell döljer sin minneshantering och dess datatyper beskriver träd! Så hur kan du uttrycka den typen av krav?

Kommentarer

  • Använd de matematiska definitionerna för sanna vektorer. Här ' ett vektorrymdbibliotek för dig hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Varifrån kommer kraven för Vector? Jag känner till flera definitioner av termen ' vektor ' och bara en av dem har sådana krav (C ++ ' s std::vector).
  • Till en del sträcker sig på samma sätt som hur man lagrar ett värde i registret i säg C eller C ++, eller om du frigör minne i GC-språk – kompilatorn är fri att ordna om data, placera värdena i register etc. eller exponera sakerna med (tillägg) [ tinyurl.com/ovvxtqt ]/(libraries) [http://hackage.haskell.org/… till programmerare om de verkligen behöver dem – men antagandet är att de inte bryr sig ' i de flesta fall. På liknande sätt bryr sig Haskell-programmerare inte ' i de flesta fall om data packas i sekventiell minnesregion istället för att till exempel eliminera behovet av utvärdering helt.

Svar

Inte alla datatyper i Haskell är träd. Det finns också de inbyggda typerna som funktioner eller Int. Bland dem hittar du typen Array som ger dig O (1) tillgång till dess element.

Vissa kompilatorer, som GHC, ger också opackade matriser. De använder mindre minne och åtkomst per element är snabbare, men det förändrar naturligtvis inte komplexiteten.

Utöver dessa arrays kan man bygga datatyper som liknar std::vector i C ++. Ett exempel är vektor bibliotek.

Svar

Du bör titta på Data.Vector.Unboxed och Data.Vector.Mutable i vektorpaketet:

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

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *