Como um verdadeiro tipo de vetor pode ser implementado em Haskell? Para que algo seja um vetor, ele deve ser armazenado sequencialmente na memória, com O(1) acesso aleatório. Mas Haskell esconde seu gerenciamento de memória e seus tipos de dados descrevem árvores! Então, como você poderia expressar esse tipo de requisito?

Comentários

  • Use as definições matemáticas para vetores verdadeiros. Aqui está ' uma biblioteca de espaço vetorial para você hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • De onde vêm esses requisitos para o vetor? Eu conheço várias definições do termo ' vetor ' e apenas uma delas tem tais requisitos (C ++ ' s std::vector).
  • Até certo ponto, da mesma forma como armazenar um valor no registro em, digamos, C ou C ++, ou você gratuitamente memória na linguagem GC – o compilador é livre para reorganizar os dados, colocar os valores no registro etc. ou expor as coisas por (extensões) [ tinyurl.com/ovvxtqt]/(libraries) [http://hackage.haskell.org/… aos programadores se eles realmente precisarem deles – mas presume-se que eles não ' se importam na maioria dos casos. De maneira semelhante, os programadores de Haskell não ' se preocupam na maioria dos casos se os dados são compactados na região sequencial da memória em vez de, por exemplo, eliminar a necessidade de avaliação por completo.

Resposta

Nem todos os tipos de dados em Haskell são árvores. Existem também os tipos internos, como funções ou Int. Entre eles, você encontra o tipo Array que lhe dá acesso O (1) aos seus elementos.

Alguns compiladores, como GHC, também fornecem matrizes unboxed. Esses usam menos memória e o acesso por elemento é mais rápido, mas isso não altera a complexidade do curso.

Além desses arrays, pode-se construir tipos de dados semelhantes a std::vector em C ++. Um exemplo é a biblioteca vetorial .

Resposta

Você deve olhar para Data.Vector.Unboxed e Data.Vector.Mutable no pacote de vetores:

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *