Hoe kan een echt Vector-type worden geïmplementeerd in Haskell? Om iets een Vector te laten zijn, moet het opeenvolgend in het geheugen worden opgeslagen, met O(1) willekeurige toegang. Maar Haskell verbergt zijn geheugenbeheer en zijn datatypes beschrijven bomen! Dus hoe zou je dat soort vereisten kunnen uitdrukken?

Opmerkingen

  • Gebruik de wiskundige definities voor echte vectoren. Hier ' is een vectorruimtebibliotheek voor jou hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • Waar komen die vereisten voor Vector vandaan? Ik ken meerdere definities van de term ' vector ' en slechts één daarvan heeft dergelijke vereisten (C ++ ' s std::vector).
  • Tot op zekere hoogte op dezelfde manier als hoe je een waarde in het register opslaat in bijvoorbeeld C of C ++, of je bent gratis geheugen in GC-taal – de compiler is gratis om gegevens te herschikken, de waarden in het register te plaatsen enz. of de dingen bloot te leggen door (extensions) [ tinyurl.com/ovvxtqt … [http://hackage.haskell.org/… aan programmeurs als ze ze echt nodig hebben – maar er wordt aangenomen dat het ze in de meeste gevallen ' niet kan schelen. Op dezelfde manier schelen Haskell-programmeurs het ' in de meeste gevallen niet of de gegevens zijn verpakt in een sequentieel geheugengebied in plaats van bijvoorbeeld de noodzaak voor evaluatie volledig te elimineren.

Answer

Niet alle gegevenstypen in Haskell zijn bomen. Er zijn ook de ingebouwde typen zoals functies of Int. Onder deze vind je het type Array die je O (1) toegang geeft tot zijn elementen.

Sommige compilers, zoals GHC, bieden ook arrays uit de doos. Die gebruiken minder geheugen en de toegang is per element sneller, maar dat verandert natuurlijk niets aan de complexiteit.

Bovenop die arrays kan men datatypes bouwen die vergelijkbaar zijn met std::vector in C ++. Een voorbeeld is de vector bibliotheek.

Antwoord

Je moet Data.Vector.Unboxed en Data.Vector.Mutable in het vectorpakket bekijken:

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *