Haskell Slides
Haskell Slides
1
2
¿Qué es Haskell?
1. Es un lenguaje de programación
2. Utiliza el paradigma funcional
2.1 Las funciones son ciudadanos de primer nivel. Es decir, se
pueden utilizar de las mismas maneras en las que se utiliza
cualquier otro tipo de valor.
2.2 El modo de trabajo de los programas realizados con Haskell se
centra alrededor de la evaluación de expresiones en lugar de la
ejecución de instrucciones.
3. Es un lenguaje puro
3.1 Es inmutable por diseño
3.2 El ser inmutable garantiza la ausencia de efectos secundarios
3.3 Tiene características de idempotencia
3.4 Beneficia el paralelismo
4. Es un lenguaje con evaluación tardía (lazy)
3
Primera prueba con Haskell
1. Abrir el navegador e ir a:
https://repl.it/languages/haskell
Plan B: https://tio.run/#haskell
2. Tipeamos el siguiente código
square(x) = x * x
main = print (square 42)
3. Presionamos Run
4. ¿Qué obtenemos?
4
Cómo funciona la evaluación tardía
5
Función definida en el lenguaje
-- http://bit.ly/haskell-and
(&&) :: Bool -> Bool -> Bool
True && x = x
False && x = False
Ejemplo:
('H' == 'i') && ('a' == 'm')
6
Otro enfoque: ¿qué hace el siguiente código?
int total = 0;
for (int i = 0; i < lst.length; i++)
total = total + 3 * lst[i]; // indexitis!
System.out.println(total);
7
Mismo ejemplo, ahora con Haskell
int total = 0;
for (int i = 0; i < lst.length; i++)
total = total + 3 * lst[i]; // indexitis!
System.out.println(total);
8
Parte 1: La fácil
Funciones propias
sumatoria :: Int -> Int
sumatoria 0 = 0
sumatoria n = n + sumatoria (n - 1)
9
Hailstone
-- https://rosettacode.org/wiki/Hailstone_sequence#Haskell
hailstone :: Int -> Int
hailstone n
| even n = n `div` 2
| otherwise = 3 * n + 1
10
Ejercicio: Fibonacci
?
11
Ejercicio: Fibonacci (Resolución)
fib :: Int -> Int
fib 0 = 0
fib 1 = 1
fib n = fib (n - 1) + fib (n - 2)
12
Funciones sobre listas
-- ¿Qué hace este código?
misterio :: [Int] -> Int
misterio [] = 0
misterio (x:xs) = 1 + misterio xs
13
Funciones sobre listas
-- ¿Y este otro?
misterioDos :: [Int] -> [Int]
misterioDos [] = []
misterioDos [x] = [x * x]
misterioDos (x:xs) = (x * x) : (misterioDos xs)
14
Ejercicio: Contar los pares de una lista
contarPares :: [Int] -> Int
15
Ejercicio: Contar los pares de una lista (resolución)
contar :: Int -> Int
contar x = case (x `mod` 2) of
0 -> 1
_ -> 0
16
Ejercicio: Sumar los pares de una lista (resolución)
sumar :: Int -> Int
sumar x = case (x `mod` 2) of
0 -> x
_ -> 0
17
Bonus: Contar “notables”
notable :: Int -> Int
notable x = case (x `mod` 2) of
0 -> 1
_ -> 0
18
Parte 2: La moderada
Pattern Matching
19
Dos operadores notables
• El operador ++ sirve para concatenar dos listas
• El operador :, en cambio, sirve para agregar elementos antes
de las listas
x:xs -- válido
x++xs -- no válido
xs:ys -- no válido
xs++ys -- válido
20
Ejercicios:
21
Resoluciones
queue :: a -> [a] -> [a]
queue x xs = xs++[x]
22
Parte 3: La difícil
Currying
function x y = x + y
fun y = function 3 y
fun 2
23
Otro ejemplo
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
24
FIN
25