Haskell

Haskell es un lenguaje funcional puro que conviene aprender para entender el paradigma funcional frente a otros lenguajes que no son funcionales puros, o que combinan la orientación a objetos y otras características de los lenguajes imperativos con las características de los lenguajes funcionales.

En Haskell los comentarios se indican precedidos de dos guiones “–“:

— comentario de una linea

Tipos de datos

Haskell NO es un lenguaje de tipado dinámico. Es decir si declaramos que una función debe recibir por ejemplo un entero y recibe un argumento de otro tipo (por ejemplo Float o Double), el programa fallará.

Tipos básicos

– Boleano -> bool (True/False)
Operadores:
&& (and), || (or), not (negacion), otherwise (func. constante que devuelve True) …

– Char (letras sueltas, caracteres) -> ‘a’, ‘B’
Operadores:
ord (codigo ascii), chr (dado el valor ascio devuelve el caracter),
isUpper (si es mayuscula), isDigit (si es digito), toLower (convierte a minuscula) …

– String (cadena de caracteres, como un array de char) -> “Pepe” (equivale a [‘P’, ‘e’, ‘p’, ‘e’]),
“jkp123” (si interpretamos los numeros en este caso como caracteres)

– Int (enteros con precision arbitraria) -> 1, 2, 3 .. 99 .. 144
Operadores:
+, -, *, div (division entera), mod (modulo), abs (valor absoluto), negate (multiplica por -1),
even (si es par), odd (si es impar) …

– Float (reales con precision arbitraria) -> -23.55, 40e-6
– Double (reales con precision doble) -> -40.55
Operadores (tanto para float como double):
+, -, *, abs, Truncate (elimina los decimales), round (redondea a entero),
floor (devuelve el entero inferior), ceiling (devuelve el entero superior),
fromInteger (convierte de entero) …

Operadores comunes:
== igual
/= distinto
< menor
<= menor o igual
> mayor
>= mayor o igual

 

Expresiones condicionales

Hay 3 tipos:

– if..then..else
Es la expresion más comun y que se encuentra en la mayoria de los lenguajes.
Su sintaxis es:

if condicion then resultado1 else resultado2

Además se puede anidar de la forma:

if condicion then resultado1 else
if condicion2 then resultado2 else resultado3

– Case
Otra muy comun en distintos lenguajes.

funcionCase :: Int -> String
funcionCase x = case x of
0 -> “Es cero”
1 -> “Es uno”
2 -> “Es dos”

– Guardas
Esta funcion es mas rara encontrarla en otros lenguajes, como por ejemplo los
imperativos. Es similar al case pero realizando comparaciones:

funcionGuardas :: Int -> Int -> String
funcionGuardas x, y
| x > y = “Es mayor”
| x == y = “Son iguales”
| otherwise = “Es menor”

Listas

Una lista es simplemente una sucesión de elementos de igual tipo. Dicha sucesión puede ser de cualquier tipo.
Las listas se declaran con corchetes:

[Int], [String]

Se pueden definir:
[1, 2, 3, 4]
[1..10] todos los numeros del 1 al 10
[1, 2..16] va aumentando el valor multiplicando por 2 hasta 16
[‘a’..’z’] todos los caracteres de la a a la z

Añadir por la izquierda
1:[3, 4] es igual a
1:3:[4] y a
[1, 3, 4]

Concatenar
[1, 2, 3] ++ [4, 5] devolvera [1, 2, 3, 4, 5]

Funciones sobre listas:

Invertir el orden de una lista
reverse “pepa” = “apep”

Longitud
length [2, 3, 4, 6] = 4

Elemento cabeza
head [1, 2, 3, 4] = 1

Cola de la lista (todos los elementos menos el primero)
tail [1, 2, 3, 4] = [2, 3, 4]

Ultimo elemento de la lista
last [1, 2, 3, 4] = 4

Los n primeros elementos de una lista
take 2 [1, 2, 3, 4] = [1, 2]

Lista eliminando los n primeros elementos
drop 2 [1, 2, 3, 4] = [3, 4]

Devolver el elemento n de la lista (la primera posicion es 0)
[1, 2, 3, 4]!!3 = 4

Juntar dos listas en lista de tuplas
zip [1, 2, 3] [7, 6, 5] = [(1, 7), (2, 6), (3, 5)]

 

Listas por comprension

Las listas por comprension se denotan de la forma:

[expresion | cualificador1, cualificador2, …]

La expresion es una operacion que se aplicara sobre el cualificador.
El cualificador puede ser un generador, un flitro o una defincion.

Ejemplo generador:

[x + y | x <- [1..5]], y <- [6..10] = [7, 9, 11, 13, 15]

Ejemplo filtro:

[x | x <- [1..10], odd x] = [1, 3, 5, 7, 9]

Tuplas

Son una sucesión de elementos, al igual que las Listas, pero en este caso los elementos
contenidos pueden ser de distinto tipo. Se declaran con paréntesis:

(Tipo1, Tipo2, …, Tipon)

(Int, Float, String, …, bool)

(1, 34.6, “jajaja”, …, True)
Próximamente la parte 2.

Se han cerrado los comentarios