Slide 1

Slide 1 text

Introducción a Haskell

Slide 2

Slide 2 text

Gracias a todos por venir y gracias a los organizadores de Betabeers por permitirnos dar esta charla de Haskell. ¡Para nosotros un gran placer!

Slide 3

Slide 3 text

" Anler # Co-organizador del meetup Haskell Mad (comunidad de Haskell de Madrid). Tengo experiencia principalmente en el mundo de las aplicaciones web y he trabajado profesionalmente con PHP, Ruby, Python y JavaScript. Trabajo actualmente con Scala en Fidesmo y en mi tiempo libre con Haskell. Mi cuenta de twitter es @anler por si os interesa seguirme

Slide 4

Slide 4 text

Mi estrategia para esta charla es dividirla en tres partes: 1. Cuál es mi motivación
 2. Cómo Haskell me ayuda
 3. Uso conocido en la industria

Slide 5

Slide 5 text

1. Motivación

Slide 6

Slide 6 text

Principalmente la necesidad de poder confiar en el código que escribo.

Slide 7

Slide 7 text

La mayor parte del tiempo no tengo idea de lo qué estoy haciendo…

Slide 8

Slide 8 text

y constantemente estoy solucionando el problema equivocado…

Slide 9

Slide 9 text

y esto me lleva a estar modificando el código que escribo una y otra vez…

Slide 10

Slide 10 text

peor aún, a modificar también el código que no yo no he escrito…

Slide 11

Slide 11 text

peor peor aún es que la mayor parte de la vida de una aplicación se dedica a mantenimiento…

Slide 12

Slide 12 text

peor peor peor aún es que cada vez que modifico código pasa esto:

Slide 13

Slide 13 text

PHP Fatal error: Call to undefined method stdClass::something()

Slide 14

Slide 14 text

Uncaught TypeError: undefined is not a function

Slide 15

Slide 15 text

Uncaught exception: ReferenceError: Cannot assign to ‘this’

Slide 16

Slide 16 text

AttributeError: 'NoneType' object has no attribute ‘something’

Slide 17

Slide 17 text

NoMethodError: undefined method `something' for nil:NilClass

Slide 18

Slide 18 text

sinceramente me siento como un monocada vez que al cambiar una cosa romper 50 y que se de cuenta mi jefe mientras le hace una demo del producto a un potencial cliente muy importante

Slide 19

Slide 19 text

Al principio hice lo que todos, busqué refugio en: - Las buenas prácticas 
 - TDD 
 - Software craftmanship

Slide 20

Slide 20 text

⛩ busqué: disciplinarme, hacerme más riguroso ⛩

Slide 21

Slide 21 text

Pero aún cuando aprendí todo lo que fui capaz para ser más riguroso y aún cuando aprendí a escribir tests suficientemente buenos, mi código seguía (y sigue) fallando

Slide 22

Slide 22 text

–Edsger Dijkstra “Program testing can be used to show the presence of bugs, but never to show their absence!”

Slide 23

Slide 23 text

Y es que con todo lo riguroso que pueda ser, solo puedo escribir tests para detectar solo los errores que sé que puedo cometer!

Slide 24

Slide 24 text

Después de llevar un tiempo frustrado, infeliz, sintiéndome inútil, maldiciendo los clientes, maldiciendo el no poder trabajar con un equipo que “hiciese las cosas bien”... me di cuenta que quizás la culpa no era mía, ni de mis compañeros, ni del cliente…

Slide 25

Slide 25 text

Sino es culpa de cómo entendemos y adoptamos las metodología. El problema que veo con el craftmanship es que pone toda la rigurosidad en los hombros del programador, nos exige que seamos disciplinados…

Slide 26

Slide 26 text

Y es que no lo somos de forma natural, somos humanos, nos distingue la creatividad no la disciplina... las máquinas en cambio sí lo son!

Slide 27

Slide 27 text

Por qué no trasladamos esa carga a las máquinas ⁉

Slide 28

Slide 28 text

2. Haskell

Slide 29

Slide 29 text

Haskell es funcional

Slide 30

Slide 30 text

Es un paradigma de construcción de programas donde estos se construyen utilizando funciones matemáticas.

Slide 31

Slide 31 text

¿En la práctica qué significa programar con funciones matemáticas? 1. No se pueden modificar variables. 2. No se pueden modificar estructuras de datos. 3. No se pueden utilizar las excepciones. 4. No se puede escribir por la terminal. 5. No se puede escribir a un fichero. 6. No se puede dibujar en pantalla.

Slide 32

Slide 32 text

Slide 33

Slide 33 text

La programación funcional es una restricción en la forma en la que escribimos programas, no en qué nuestros programas pueden expresar.

Slide 34

Slide 34 text

Haskell es estático

Slide 35

Slide 35 text

$ ghc —make holaMundo.hs $ ./holaMundo Hola, Mundo! $ runhaskell holaMundo.hs Hola, Mundo!

Slide 36

Slide 36 text

Haskell tiene tipado fuerte

Slide 37

Slide 37 text

❌ 5 + “veces”

Slide 38

Slide 38 text

✅ show 5 + “veces”

Slide 39

Slide 39 text

❌ (5 :: Integer) + (5 :: Float)

Slide 40

Slide 40 text

✅ fromIntegral (5 :: Integer) + (5 :: Float)

Slide 41

Slide 41 text

✅ (5 :: Integer) + round (5 :: Float)

Slide 42

Slide 42 text

❌ if 0 then … else …

Slide 43

Slide 43 text

✅ if a == 0 then … else …

Slide 44

Slide 44 text

name = “Haskell” ✅ name = “Python” ❌

Slide 45

Slide 45 text

Haskell tiene inferencia de tipos

Slide 46

Slide 46 text

main :: IO ()
 main = printHelloWorld
 
 printHelloWorld :: IO ()
 printHelloWorld = putStrLn helloMsg
 
 helloMsg :: String
 helloMsg = “Hello, World!”

Slide 47

Slide 47 text

main = printHelloWorld
 
 printHelloWorld = putStrLn helloMsg
 
 helloMsg = “Hello, World!”

Slide 48

Slide 48 text

Haskell tiene repl

Slide 49

Slide 49 text

$ ghci
 GHCi, version 8.0.1.20161114
 ? for help Prelude> printStrLn “Hello, World!” Hello, World! Prelude>

Slide 50

Slide 50 text

Haskell es conciso

Slide 51

Slide 51 text

numbers = [1, 2, 3, 4, 5] oddNumbers = filter odd numbers incNumbers = map (+1) numbers sumNumbers = sum numbers

Slide 52

Slide 52 text

data Bool = True | False (||) :: Bool -> Bool -> Bool False || y = y True || _ = True myOr = (||)

Slide 53

Slide 53 text

En Haskell todo es una expresión

Slide 54

Slide 54 text

name withBang = “Hello, World” ++ if withBang
 then “!” else “”

Slide 55

Slide 55 text

En Haskell todas las funciones reciben un argumento

Slide 56

Slide 56 text

add a b = a + b add1 = add 1 three = add1 2 ((add 2) 3) // 5

Slide 57

Slide 57 text

Haskell es perezoso

Slide 58

Slide 58 text

numberOne = head allNaturals allNaturals = [1..]

Slide 59

Slide 59 text

throwException = error “Booom!” neverFail = const “Haha!” neverFail throwException // “Haha” :: String throwException // *** Exception: Booom! //

Slide 60

Slide 60 text

Haskell es puro

Slide 61

Slide 61 text

getLine :: IO String unwrap :: IO String -> String putStrLn :: String -> IO () putStrLn getLine ❌ putStrLn (unwrap getLine) ✅

Slide 62

Slide 62 text

newtype MyInt = MyInt Int doSomethingToMyInt :: MyInt -> … doSomethingToMyInt 123 ❌ doSomethingToMyInt (MyInt 123) ✅

Slide 63

Slide 63 text

3. Uso en la industria

Slide 64

Slide 64 text

Standard Chartered lo usa para implementar todo su stack

Slide 65

Slide 65 text

Facebook implementa sus programas anti-spam con Haskell

Slide 66

Slide 66 text


 Bluespec SystemVerilog (BSV) es un lenguaje para diseño de semiconductores que es una extensión de Haskell

Slide 67

Slide 67 text

Cryptol, un lenguaje y herramientas para desarrollar algoritmos criptográficos está implementado en Haskell

Slide 68

Slide 68 text

Elm, un lenguaje y framework para desarrollar aplicaciones web puramente frontend está implementado en Haskell

Slide 69

Slide 69 text

El primer microkernel formalmente verificado utilizó Haskell como lenguaje de prototipado.

Slide 70

Slide 70 text

Conclusiones

Slide 71

Slide 71 text

Haskell es un lenguaje que cambiará la forma en la que piensas, está preparado para el uso industrial y te ayudará a construir software más robusto.

Slide 72

Slide 72 text

Si estáis interesados en aprender más en Madrid contamos con una comunidad de entusiastas de Haskell: 
 Meetup Madrid: meetup.com/Haskell-MAD/ Y además un canal de Slack: Canal de Slack: haskellnautas.herokuapp.com

Slide 73

Slide 73 text

¡Estáis todos invitados a uniros a nuestra pequeña
 pero apasionada comunidad!

Slide 74

Slide 74 text

¡Gracias!