Una lista es una estructura de datos que representa un conjunto de datos de un mismo tipo, es muy usada e importante en el lenguaje haskell.
Su declaración es muy simple, ejem:
[Int]: Representa una lista de enteros [4,5,9,25,60 ]
[Char]: Representa una lista de chars ['l','i','n','u','x']
[Bool]: Representa una lista de valores booleanos [True, False, True]
[String]: Representa una lista de strings ["buenas","noches"]
[Float]: Representa una lista de flotantes [2.5,5.8,4.3,7.1 ]
También podríamos definir una lista de listas así: [[Int]], pero eso lo veremos más adelant con el tema de matrices. Una lista vacía se representa [] y algo importante para el manejo de listas es separar el primer elemento (cabeza), del resto(cola) de la sgt manera(x:xs) . X representa la cabeza y xs la cola.
Como Haskell hace mucho uso de la recursividad entonces, debemos tener en cuenta cuando deterne la operación recursiva y para ello necesitamos un caso base.
Vamos a ver algunos ejemplos:
1.- Sumar los elementos de una lista.En este caso, el caso base es que la lista se encuentre vacía y devuelve 0, mientras tanto que siga sumando los elementos con la operación recursiva.
sumar::[Int]->Int
sumar [ ] = 0
sumar (x:xs) = x + sumar(xs)
Main> sumar [5,4,7,8]
24
2.- Invertir una lista: El operador Ord me sirve para indicar que representa a cualquier tipo de dato.
invertir::Ord a=>[a]->[a]
invertir [ ] = [ ]
invertir (x:xs) = (invertir xs)++[x]
Main> invertir [5,4,7,8]
[8,7,4,5]
3.- Comparar si 2 listas son iguales:
igualLista:: Eq a => [a]->[a]->Bool
igualLista l1 l2 = l1 == l2
Main> igualLista ["Hola","Mundo"] ["Mundo","Hola"]
False
4.- Comprobar si una lista esta ordenada: En este caso ‘y’ representa al 2do elemento de la lista.
lista_ordenada::Ord a=>[a]->Bool
lista_ordenada [] = True
lista_ordenada [_] = True
lista_ordenada (x:y:xs) = (x<=y) && lista_ordenada (y:xs)
Main> lista_ordenada ['a','b','c','d']
True
5.- Mostrar el elemento que se encuentra en cierta ubicacion:Como en un array el 1er elemento esta en la ubicacion 0.
mostrar_ubicacion::Ord a=>[a]->Int->a
mostrar_ubicacion l n = l!!n
Main> mostrar_ubicacion [15,25,26,28] 2
26
6.- Mayor elemento de una lista:
mayor::[Int]->Int
mayor (x:xs)
| x > mayor(xs) = x
| otherwise = mayor(xs)
Main> mayor [78,24,56,93,21,237,46,74,125]
237
Listas por comprensión: Son listas que no usan cabeza y cola, sino ciertos argumentos para definir los elementos que pertenecen a ella, de esta manera resolvemos problemas de una manera muy elegante y potente. Ejm: Le decimos a haskell que queremos una lista de elementos x, tales que x este en el rango de 1 a 12.
Main> [x | x <- [1 .. 12]]
[1,2,3,4,5,6,7,8,9,10,11,12]
Apliquemos esto a las operaciones con listas.
1.- Contar cuantos elementos pares hay en una lista. Estamos diciendo que x pertenece a la lista y ademas debe cumplir la condición de ser par. Como en varios lenguajes el length cuenta los elementos.
contarpares::[Int]->Int
contarpares []=0
contarpares lista= length [x | x <- lista, mod x 2 ==0]
Main> contarpares [5,4,7,8]
2
2.- Devolver los cuadrados de una lista:
cuadrados::[Int]->[Int]
cuadrados [ ] = [ ]
cuadrados l = [x*x| x <- l]
Main> cuadrados [1..10]
[1,4,9,16,25,36,49,64,81,100]
3.- Devolver una lista de numeros primos de 1 a n: Para ello debemos crear nuestra funcion para saber si un numero es primo o no y despues la aplicamos a la lista por comprensión:
divisible::Int->Int->Bool
divisible x y = (mod x y) ==0
divisibles::Int->[Int]
divisibles x = [y | y <-[1..x],divisible x y]
esPrimo::Int->Bool
esPrimo n = length (divisibles n) ==2
primos::Int->[Int]
primos n = [x | x <-[1..n],esPrimo x]
Main> primos 100
[1,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]
Continuaré en el sgt post con problemas mas avanzados y otros temas en haskell.










un pequeño fallo, el 1 no sale en la lista, ya que la condicion es que se hayan contado solo dos numeros que dividen exactamente al numero ( los primos solo son divisibles por ellos mismo y por el uno ) , pero claro, el 1 solo se divide por el mismo, por lo que solo se cuenta 1 vez
luego habria que cambiar la condicion ‘==’ por ‘<=’ y el uno ya sale en la lista ^_^
gracias por hacer este blog, me esta ayudando mucho con mis practicas en la facultad !
muy buen trabajo, ya que se presenta buena informacion acerca de las listas de haskell
Hola,soy un principiante con haskell. Estoy cursando paradigma y no se como hacer para ingresar o complilar los ejemplos,si sos muy amable me podes explicar como hacerlo…. Otra es que no tengo irea como hacer una lista de caracteres,a los pares pasarlos a mayuscula y a los impares en minuscula y como concatenar dos listas,si podes haceme el favor de darme una ayuda.muchas gracias y que dios te bendiga… contestame lo mas antes posible.Muchisimas gracias…
necesito saber que significa la barra vertical que figura despues de x contarpares lista= length [x | x <- lista, mod x 2 ==0]
estoy estudiando en la Tecnologica de Tucuman. Gracias por todo
David Los ejemplos puedes probarlos con el intérprete hugs, que está disponible para múltiples plataformas (Linux, Mac, Windows, etc).
No te entendí muy bien sobre lo de conversión de caracteres pares o impares podrías ser más explícito.
En el caso de concatenar 2 listas es simple: Aquí está el código.
conc_lists::[a]->[a]->[a]
conc_lists xs [] = xs
conc_lists [] ys = ys
conc_lists (x:xs) (y:ys) = x: (conc_lists xs (y:ys))
Ejemplo:
Main> conc_lists[1,2,3][4,5,6]
[1,2,3,4,5,6]
Te lo explico brevemente:
Tu función se llama conc_list, Primero declaras tus argumentos de entrada y salida.
Recibes una lista, otra lista y te da como resultado igualmente una lista concatenada. Preguntas si alguna de las listas en vacía, si es así devuelve la otra lista.
Por último, tomamos las 2 listas y empezamos a concatenar la cabeza de la lista 1 y empezamos a llamar recursivamente a la función para que concatene la cola de la lista 1 con los elementos de la lista 2.
Tienes que tener bien en claro, lo que es la cabeza y cola de la lista y lo que significa recursión (una función que se llama así misma).
Espero te sirva, cualquier consulta avisas. Saludos
Alejandra la barra vertical indica la condición que debe cumplir la misma variable x para poder ser tomada en cuenta por la función length. Es como una asignación a lo que debe ser x.
En este caso se leería x tal que x pertenece a la variable lista y además de ello que cumpla con la condición de que su división entre 2 de como residuo cero.
Espero aclare tu duda. Saludos