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.

Categorías: Sin categoría

Entradas relacionadas

Sin categoría

Proxy en OpenSUSE

Ultimamente comienzo mis andanzas por Suse, un poco coñazo porque estoy hecho a Debian y derivadas (Ubuntu y cia.), y alguna vez he usado CentOS y familia y poco mas. Y cual es el problema Leer más…

Sin categoría

Abrir puertos en una máquina virtual de Azure

Con el cambio del portal clásico al nuevo portal de Azure, aveces puede resultar difícil hacer algo tan básico como abrir los puertos de una máquina virtual. Y ya que la documentación de Microsoft es Leer más…

Sin categoría

Proyecto MuSync – Alternativa Spotify

MuSync es un proyecto que nace con el objetivo personal de reemplazar Spotify en mis dispositivos. Actualmente tengo una enorme dependencia del servicio freemium de Spotify y ya no hago acopio en formato mp3 de las Leer más…

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies