Haskell Hero

Haskell Hero es un manual interactivo del lenguaje Haskell para principiantes.

Listas

Lista como un tren

Como ya hemos dicho en la lección sobre funciones útiles, las listas las escribimos entre corchetes y sus elementos los separamos por comas.

[8,5,3]
Una lista vacía la creamos con dos corchetes [] y cuando queremos insertar un elemento a la lista, usamos el operador binario (:). Agregamos el elemento 10 a la lista [8,5,3] de manera siguiente:
10 : [8,5,3]
La expresión 10:[8,5,3] no se evalúa más, ya está en la forma irreducible y sustituible por [10,8,5,3]. Generalmente todas las expresiones siguientes son sustituibles a gusto ((:) asocia de la derecha):
[10,8,5,3]
10:[8,5,3]
10:8:[5,3]
10:8:5:[3]
10:8:5:3:[]

La lista escrita en la forma 8:5:3:[] la podemos representar como un tren. Este tren se distingue del normal solo por llevando datos en vez de pasajeros y por la locomotora empujando los coches, no tirando de ellos.

Entonces una lista es un tren donde elementos son representados por coches, el operador (:) por un guión entre coches y la lista vacía por una locomotora.


La lista [8,5,3] representada por el tren

Operaciones con listas

Con listas podemos hacer tres operaciones:

  1. agregar un elemento a su principio (al lado izquierdo)
  2. mirar que es su primer elemento y como es la lista sin el primer elemento
  3. comprobar si es una lista vacía (eventualmente lista de un elemento, dos elementos,...)
Nada más. Todas las otras operaciones con listas están basadas en estas tres básicas.

Por ejemplo la función head que devuelve el primer elemento de una lista se define de manera siguiente:

head       ::  [a] -> a
head (x:s)  =  x
La evaluación de la expresión head [1,2,3] es la siguiente:

  • la lista [1,2,3] la escribimos 1:[2,3], sacando el primer elemento de la lista
  • en la parte izquierda de la definición de la función head sustituimos x por 1 y s por [2,3]
  • la expresión la sustituimos por la parte izquierda de la definición, lo que es en general x, aquí el elemento sustituido 1

El resultado es entonces 1.

Nota: Ya que la variable s no aparece en la parte derecha de la definición de la función head, podemos sustituirla por un guión bajo.

head (x:_) = x