Pregunta

Estoy aprendiendo Haskell de un entorno Java. Cuando programa Java, me siento como si tuviera una sólida comprensión de cómo los objetos se colocan en la memoria y las consecuencias de esto. Por ejemplo, yo sé exactamente cómo java.lang.String y el trabajo java.util.LinkedList y por lo tanto sé lo que debo usarlos. Con Haskell estoy un poco perdido. Por ejemplo, ¿cómo funciona el (:)? ¿Debería importarme? Es especifica en alguna parte?

¿Fue útil?

Solución

La respuesta corta es no. Al programar en Haskell usted debe pensar en sus estructuras de datos como objetos matemáticos puros y no preocuparse por la forma en que están representados en la memoria. La razón de esto es que, en ausencia de efectos secundarios, no hay realmente nada a los datos, excepto las funciones que lo crean y las funciones que puede utilizar para extraer las partes más simples de los cuales fue construido .

Para ver información acerca de constructores de datos como (:), o cualquier otro término, utilizar el comando :type (o simplemente :t para abreviar) en el interior GHCi:

:Prelude> :type (:)
(:) :: a -> [a] -> [a]

Esto le dice que el constructor (:) (pronunciado "contras"), toma un valor de cualquier tipo, y una lista del mismo tipo, y devuelve una lista del mismo tipo. También puede obtener un poco más de información utilizando el comando :info. Esto le mostrará lo que las miradas de definición de datos como:

Prelude> :info (:)
data [] a = ... | a : [a]   -- Defined in GHC.Types
infixr 5 :

Esto le indica que (:) es el constructor, que antepone un elemento a una lista existente.

También recomiendo altamente Hoogle no sólo para buscar las cosas por su nombre, pero para hacer el tipo inversa de búsqueda; donde se sabe que la firma de la función que busca y desea saber si alguien ya está escrito por usted. Hoogle es agradable porque da descripciones y ejemplos de usos.

Formas de inductivo de datos

he dicho anteriormente que no es importante conocer la representación de los datos en la memoria ... usted debe, sin embargo, entender la forma de los datos que está tratando, para evitar los malos resultados decisiones. Todos los datos en Haskell se define de forma inductiva, lo que significa que tiene una forma de árbol que se desarrolla cada vez hacia el exterior de forma recursiva. Se puede decir que la forma de los datos al buscar en su definición; no hay realmente nada oculto acerca de sus características de rendimiento una vez que sepa cómo leer esto:

data MyList a = Nil | Cons a (MyList a)

Como se puede ver en la definición, la única manera de conseguir un nuevo MyList es por el constructor Cons. Si utiliza este constructor múltiples veces, que va a terminar con algo más o menos de esta forma:

(Cons a5 (Cons a4 (Cons a3 (Cons a2 (Cons a1 Nil)))))

Es sólo un árbol sin ramas, que es la definición de una lista! Y la única manera de conseguir por lo a1 es haciendo estallar fuera de cada uno de los Conss a su vez; por lo tanto, el acceso al último elemento es O (n) , mientras que el acceso a la cabeza es la constante de tiempo. Una vez que pueda hacer este tipo de razonamiento acerca de las estructuras de datos en base a sus definiciones, ya está todo listo.

Otros consejos

Breve respuesta es "no", usted no necesita saber acerca de los diseños de datos -. Un conocimiento de la complejidad será aunque útil

Para escribir programas Haskell altamente optimizados, un buen conocimiento de la forma de las estructuras de datos en el montón de trabajo es esencial, sin embargo. Una herramienta para ayudar a este es "vacío" , que puede hacer que los diagramas de estructuras de datos Haskell a medida que se presentan.

Algunos ejemplos:

$ view "hello"

listas enlazadas

$ view (IntMap.fromList $ zip [1..10] [1..])

Data.IntMap

Aquí está un breve vídeo de cómo utilizar la herramienta: http: // www. youtube.com/watch?v=X4-212uMgy8

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top