Kuinka todellinen vektorityyppi voitaisiin toteuttaa Haskellissa? Jotta jokin olisi vektori, se on tallennettava peräkkäin muistiin O(1) -käyttöoikeudella. Mutta Haskell piilottaa muistinhallinnan, ja sen tietotyypit kuvaavat puita! Joten miten voisit ilmaista tällaisen vaatimuksen?

Kommentit

  • Käytä todellisten vektorien matemaattisia määritelmiä. Tässä ' sa vektoritilakirjasto sinulle hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Mistä nämä vektorin vaatimukset tulevat? Tiedän useita määritelmiä termille ' vektori ' ja vain yhdellä niistä on tällaiset vaatimukset (C ++ ' s std::vector).
  • Jotkut ulottuvat samalla tavalla kuin kuinka arvo tallennetaan rekisteriin esimerkiksi C tai C ++, tai vapautat muisti GC-kielellä – kääntäjä voi vapaasti järjestää tietoja, laittaa arvot rekisteriin jne. tai paljastaa asioita (laajennukset) [ tinyurl.com/ovvxtqt]/(kirjastot) [http://hackage.haskell.org/… ohjelmoijille, jos he todella tarvitsevat niitä – mutta oletuksena on, että he eivät ' välitä useimmissa tapauksissa. Samalla tavalla Haskell-ohjelmoijat eivät ' välitä useimmissa tapauksissa, jos data pakataan peräkkäiselle muistialueelle eikä esimerkiksi poisteta arvioinnin tarvetta kokonaan.

Vastaus

Kaikki Haskellin tietotyypit eivät ole puita. On myös sisäänrakennettuja tyyppejä, kuten toiminnot tai Int. Niistä löydät tyypin Array , joka antaa sinulle O (1) pääsyn sen elementteihin.

Jotkut kääntäjät, kuten GHC, tarjoavat myös pakkaamattomat taulukot. Ne käyttävät vähemmän muistia ja per elementti on nopeampi, mutta se ei muuta tietysti monimutkaisuutta.

Näiden taulukoiden päälle voidaan rakentaa tietotyyppejä, jotka ovat samanlaisia kuin std::vector C ++: ssa. Esimerkiksi -vektorikirjasto .

Vastaa

Tarkastele vektoripaketissa olevia Data.Vector.Unboxed ja Data.Vector.Mutable:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *