¿Cómo podría implementarse un verdadero tipo de Vector en Haskell? Para que algo sea un Vector, debe almacenarse secuencialmente en la memoria, con O(1) acceso aleatorio. ¡Pero Haskell oculta su gestión de memoria y sus tipos de datos describen árboles! Entonces, ¿cómo podría expresar ese tipo de requisito?

Comentarios

  • Use las definiciones matemáticas para los vectores verdaderos. Aquí ' una biblioteca de espacio vectorial para ti hackage.haskell.org/package/vector-space-0.8.7/docs/ …
  • ¿De dónde provienen esos requisitos para Vector? Conozco varias definiciones del término ' vector ' y solo una de ellas tiene tales requisitos (C ++ ' s std::vector).
  • Hasta cierto punto, de la misma manera que cómo almacenar un valor en el registro en, digamos C o C ++, o libre memoria en lenguaje GC – el compilador es libre de reorganizar los datos, poner los valores en el registro, etc. o exponer las cosas por (extensiones) [ tinyurl.com/ovvxtqt]/(libraries) [http://hackage.haskell.org/… a los programadores si realmente los necesitan, pero se supone que no ' les importa en la mayoría de los casos. De manera similar, los programadores de Haskell ' t se preocupan en la mayoría de los casos si los datos están empaquetados en una región secuencial de memoria en lugar de, por ejemplo, eliminar la necesidad de evaluación por completo.

Respuesta

No todos los tipos de datos en Haskell son árboles. También existen los tipos incorporados como funciones o Int. Entre ellos se encuentra el tipo Array que le da acceso O (1) a sus elementos.

Algunos compiladores, como GHC, también proporcionan matrices sin caja. Aquellos usan menos memoria y el acceso por elemento es más rápido, pero eso no cambia la complejidad, por supuesto.

Encima de esos arreglos uno puede construir tipos de datos similares a std::vector en C ++. Un ejemplo es la biblioteca vector .

Respuesta

Deberías mirar Data.Vector.Unboxed y Data.Vector.Mutable en el paquete de vectores:

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *