programación funcional con haskell

74
Programación Funcional en Haskell Agustín Ramos Fonseca #sgvirtual Wednesday, October 23, 13

Upload: software-guru

Post on 03-Jul-2015

1.008 views

Category:

Technology


3 download

DESCRIPTION

Haskell es un lenguaje funcional puro que ha encontrado una pequeña pero creciente y leal cantidad de usuarios en la industria y academia. Calificándolo como "El más avanzado de los lenguajes obsoletos", Gerlad J. Sussman (creador de Scheme) señala tanto al poder de Haskell como a las limitaciones de todos los lenguajes de programación existentes. ¿Qué lo hace especial o atractivo? ¿Vale la pena invertir nuestro tiempo en aprenderlo? En esta plática exploraremos las características más distintivas de Haskell, y como ejemplo exploraremos algunos escenarios de uso donde difícilmente tiene comparación.

TRANSCRIPT

Page 1: Programación funcional con haskell

Programación Funcional en Haskell

Agustín Ramos Fonseca

#sgvirtual

Wednesday, October 23, 13

Page 2: Programación funcional con haskell

¿Qué es Haskell?

Wednesday, October 23, 13

Page 3: Programación funcional con haskell

Wednesday, October 23, 13

Page 4: Programación funcional con haskell

Un lenguaje de programación...

Wednesday, October 23, 13

Page 5: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Wednesday, October 23, 13

Page 6: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

Wednesday, October 23, 13

Page 7: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Wednesday, October 23, 13

Page 8: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Las funciones no tienen efectos colaterales.

Wednesday, October 23, 13

Page 9: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Las funciones no tienen efectos colaterales.

• De evaluación perezosa.

Wednesday, October 23, 13

Page 10: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Las funciones no tienen efectos colaterales.

• De evaluación perezosa.

Las expresiones se evalúan hasta que es requerido.

Wednesday, October 23, 13

Page 11: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Las funciones no tienen efectos colaterales.

• De evaluación perezosa.

Las expresiones se evalúan hasta que es requerido.

• De tipado estático.

Wednesday, October 23, 13

Page 12: Programación funcional con haskell

Un lenguaje de programación...

• Funcional.

Las funciones son construcciones de primera clase.

• Puro.

Las funciones no tienen efectos colaterales.

• De evaluación perezosa.

Las expresiones se evalúan hasta que es requerido.

• De tipado estático.

Con inferencia de tipos.

Wednesday, October 23, 13

Page 13: Programación funcional con haskell

Un poco de Historia

Wednesday, October 23, 13

Page 14: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

Wednesday, October 23, 13

Page 15: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1970’s

ML yHope

Wednesday, October 23, 13

Page 16: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

19851970’s

ML yHope

Wednesday, October 23, 13

Page 17: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1985

FPCA '87

1970’s

ML yHope

Wednesday, October 23, 13

Page 18: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1985

FPCA '87

1970’s

ML yHope

¡Necesitamos Haskell!

Wednesday, October 23, 13

Page 19: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1990

Haskell 1.0

1985

FPCA '87

1970’s

ML yHope

¡Necesitamos Haskell!

Wednesday, October 23, 13

Page 20: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1990

Haskell 1.0

1985

FPCA '87

1998

Haskell ’98

1970’s

ML yHope

¡Necesitamos Haskell!

Wednesday, October 23, 13

Page 21: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1990

Haskell 1.0

1985

FPCA '87

1998

Haskell ’98

Haskell ’98Revised Report

20031970’s

ML yHope

¡Necesitamos Haskell!

Wednesday, October 23, 13

Page 22: Programación funcional con haskell

Un poco de Historia

1958

LISP(John McCarthy)

1990

Haskell 1.0

1985

FPCA '87

1998

Haskell ’98

Haskell ’98Revised Report

2003 2010

Haskell 2010

1970’s

ML yHope

¡Necesitamos Haskell!

Wednesday, October 23, 13

Page 23: Programación funcional con haskell

Motivación de los Sistemas de Tipado Estático

import foo

def bar(baz, quux): x = baz.do_something() y = quux.do_something_else() return x + y

Wednesday, October 23, 13

Page 24: Programación funcional con haskell

Motivación de los Sistemas de Tipado Estático

# Los imports pueden tener efectos colaterales,# como escribir en un archivo... o lanzar un misil.import foo

def bar(baz, quux): # baz puede ser cualquier objeto # y podría no tener el método do_something() x = baz.do_something() # quux puede ser cualquier objeto y podría # no ser capaz de ejecutaro do_something_else() y = quux.do_something_else() # El operador ‘+’ podría estar sobrecargado y # hacer algo impredecible o simplemente fallar. return x + y

Wednesday, October 23, 13

Page 25: Programación funcional con haskell

Características• List comprehensions.

• Pattern matching.

• Currying

• Composición de funciones.

• Infinite data structures.

• Agebraic Data Types

• Type classes.

• Applicative Functors

• Monads

Wednesday, October 23, 13

Page 26: Programación funcional con haskell

Ejemplos

Wednesday, October 23, 13

Page 27: Programación funcional con haskell

TiposPrelude > :t 2

2 :: Num a => a

Prelude > :t [1,2,3]

[1,2,3] :: Num t => [t]

Prelude > :t ["hola","mundo"]

["hola","mundo"] :: [[Char]]

Prelude > :t head

head :: [a] -> a

Prelude > :t [even,odd]

[even,odd] :: Integral a => [a -> Bool]

Wednesday, October 23, 13

Page 28: Programación funcional con haskell

Listas

Lista de Num

[1,2,3,4,5]

Lista (rango) de Char

[‘a’..’z’]

Lista de strings [Char]

[“hola”,”mundo”]

Wednesday, October 23, 13

Page 29: Programación funcional con haskell

Funciones sobre listas (1/2)Prelude > head [1,2,3,4,5]

1

Prelude > tail [1..5]

[2,3,4,5]

Prelude > [1..5] !! 3

4

Prelude > take 2 [1..5]

[1,2]

Prelude > filter even [1..5]

[2,4]

Wednesday, October 23, 13

Page 30: Programación funcional con haskell

Funciones sobre listas (2/2)Prelude > map (\x -> x*x) [1..5]

[1,4,9,16,25]

Prelude > zip [1..5] ['a'..'e']

[(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e')]

Prelude > zipWith (\x y -> x + y) [1..5] [11..15]

[12,14,16,18,20]

Prelude > zipWith (+) [1..5] [11..15]

[12,14,16,18,20]

Prelude > foldl (+) 0 [1..5]

15

Wednesday, October 23, 13

Page 31: Programación funcional con haskell

Funciones

Area de un círculo

circleArea r = pi * r^ 0

Secuencia de Fibonacci

fib 0 = 0fib 1 = 1fib n = fib (n-1) + fib (n-2)

Wednesday, October 23, 13

Page 32: Programación funcional con haskell

Funciones

QuickSort quicksort :: Ord a => [a] -> [a]quicksort [] = []quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater) where lesser = filter (< p) xs greater = filter (>= p) xs

Wednesday, October 23, 13

Page 33: Programación funcional con haskell

FuncionesPrelude > 1 + 23Prelude > (+) 1 23Prelude > (*) 2 36Prelude > div 10 52Prelude > 10 `div` 52Prelude > ($) even 4TruePrelude > even $ 4True

Wednesday, October 23, 13

Page 34: Programación funcional con haskell

List comprehensions

Prelude > [ x | x <- [1..10] , even x ][2,4,6,8,10]

Prelude > [ (x,y) | x <- [1..5], y <- [1..5] , even x, odd y ] [(2,1),(2,3),(2,5),(4,1),(4,3),(4,5)]

Prelude > map ($3) $ map (*) [1..10] -- La “tabla” del 3 [3,6,9,12,15,18,21,24,27,30]

Prelude > [ map ($x) $ map (*) [1..10] | x <-[2..9] ] --Las “tablas” del 2 al 9[[2,4,6,8,10,12,14,16,18,20],[3,6,9,12,15,18,21,24,27,30],[4,8,12,16,20,24,28,32,36,40],[5,10,15,20,25,30,35,40,45,50],[6,12,18,24,30,36,42,48,54,60],[7,14,21,28,35,42,49,56,63,70],[8,16,24,32,40,48,56,64,72,80],[9,18,27,36,45,54,63,72,81,90]]

Wednesday, October 23, 13

Page 35: Programación funcional con haskell

Pattern MatchingPrelude > let (x:xs) = [1..5]Prelude > x1Prelude > xs[2,3,4,5]Prelude > let (x:y:xs) = [1..5]Prelude > y2Prelude > let Just x = Just 5Prelude > x5Prelude > let (a,b,c) = (3,"hola",[1,2,3])Prelude > b“hola”

Wednesday, October 23, 13

Page 36: Programación funcional con haskell

CurryingPrelude > let sum x y z = x + y + zPrelude > sum3 1 2 36Prelude > :t sumsum :: Num a => a -> a -> a -> aPrelude > :t sum 1sum 1 :: Num a => a -> a -> aPrelude > :t sum 1 2sum 1 2 :: Num a => a -> aPrelude > let sum2and3 = sum 2 3Prelude > sum2and3 510Prelude > sum 2 4 $ 511

Wednesday, October 23, 13

Page 37: Programación funcional con haskell

Composición de Funciones

Prelude > let foo = (*2).(+5)Prelude > :t foofoo :: Integer -> IntegerPrelude > foo 418Prelude > Prelude >

Prelude > let strToUpper = map toUpperPrelude > let strToLower = map toLowerPrelude > map ($ "WaZoWzky") $ map ((reverse).) [strToUpper, strToLower]["YKZWOZAW","ykzwozaw"]

Wednesday, October 23, 13

Page 38: Programación funcional con haskell

Evaluación Perezosa

Ejemplo: El triángulo de Pascal

Wednesday, October 23, 13

Page 39: Programación funcional con haskell

Algebraic Data Types

Prelude > data Toy = Buzz | Woody | Rex | Hamm deriving (Eq, Ord, Show)Prelude > let x = RexPrelude > xRex

Prelude > data Maybe a = Nothing | Just aPrelude > :t Just 5Just 5 :: Num a => Maybe a

Wednesday, October 23, 13

Page 40: Programación funcional con haskell

Algebraic Data Types

type Radius = Floattype Side = Floattype Vertex = (Float, Float)

data Shape = Rectangle Side Side |! ! ! Ellipse Radius Radius |! ! ! RtTriangle Side Side | Polygon [Vertex] deriving Show

Wednesday, October 23, 13

Page 41: Programación funcional con haskell

Algebraic Data Types

data Car = Car { company :: String                 , model :: String                 , year :: Int                 } deriving (Show)

Prelude > let stang = Car {company="Ford", model="Mustang", year=1967}Prelude > company stang"Ford"Prelude > year stang1967

Wednesday, October 23, 13

Page 42: Programación funcional con haskell

Evaluación Perezosa

Solución:

pascal n = take n $ iterate (\r -> zipWith (+) ([0] ++ r) (r ++ [0])) [1]

Wednesday, October 23, 13

Page 43: Programación funcional con haskell

¿Por qué aprender Haskell?

Wednesday, October 23, 13

Page 44: Programación funcional con haskell

¿Por qué aprender Haskell?

"My personal reason for using Haskell is that I have found that I write more bug-free code in

less time using Haskell than any other language. I also find it very readable and extensible."

- Hal Daumé III

Wednesday, October 23, 13

Page 45: Programación funcional con haskell

¿Por qué aprender Haskell?

"Learning Haskell may not get you a job programming in Haskell, but as Paul Graham

postulates, it may still get you a job. Personally, I find that irrelevant. Learning the language has proven to be fun and rewarding and I plan to

continue my Haskell adventures into 2012”

- Sean Voisen

Wednesday, October 23, 13

Page 46: Programación funcional con haskell

¿Por qué aprender Haskell?

Wednesday, October 23, 13

Page 47: Programación funcional con haskell

¿Por qué aprender Haskell?• Incorpora conceptos de programación de un nivel

de abstracción superior a los existentes en otros lenguajes.

Wednesday, October 23, 13

Page 48: Programación funcional con haskell

¿Por qué aprender Haskell?• Incorpora conceptos de programación de un nivel

de abstracción superior a los existentes en otros lenguajes.

Mayor abstracción => Mayor poder

Wednesday, October 23, 13

Page 49: Programación funcional con haskell

¿Por qué aprender Haskell?• Incorpora conceptos de programación de un nivel

de abstracción superior a los existentes en otros lenguajes.

Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías.

Wednesday, October 23, 13

Page 50: Programación funcional con haskell

¿Por qué aprender Haskell?• Incorpora conceptos de programación de un nivel

de abstracción superior a los existentes en otros lenguajes.

Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías.

Te convierte en mejor programador

Wednesday, October 23, 13

Page 51: Programación funcional con haskell

¿Por qué aprender Haskell?• Incorpora conceptos de programación de un nivel

de abstracción superior a los existentes en otros lenguajes.

Mayor abstracción => Mayor poder

• Los conceptos y estilo de programación aprendidos, son aplicables a otros lenguajes y tecnologías.

Te convierte en mejor programador

• Es una plataforma madura para el desarrollo de aplicaciones en el mundo real.

Wednesday, October 23, 13

Page 52: Programación funcional con haskell

¿Por qué aprender Haskell?

Wednesday, October 23, 13

Page 53: Programación funcional con haskell

¿Por qué aprender Haskell?

• Presenciar la evolución de un lenguaje/plataforma ya madura y estable, pero con un ritmo de crecimiento muy interesante.

Wednesday, October 23, 13

Page 54: Programación funcional con haskell

¿Por qué aprender Haskell?

• Presenciar la evolución de un lenguaje/plataforma ya madura y estable, pero con un ritmo de crecimiento muy interesante.

• La comunidad es muy dinámica y presta ayuda.

Wednesday, October 23, 13

Page 55: Programación funcional con haskell

Porque... #SoyPunk

Wednesday, October 23, 13

Page 56: Programación funcional con haskell

Para saber más... (1/3)

Wednesday, October 23, 13

Page 57: Programación funcional con haskell

Para saber más... (1/3)

Wednesday, October 23, 13

Page 58: Programación funcional con haskell

Para saber más... (1/3)

Wednesday, October 23, 13

Page 59: Programación funcional con haskell

Para saber más... (2/3)

Wednesday, October 23, 13

Page 60: Programación funcional con haskell

Para saber más... (3/3)

• http://tryhaskell.org/

Tutorial interactivo en línea

• http://www.haskell.org

Sitio oficial de Haskell

• http://j.mp/1cMCJr5

Yet Another Haskell Tutorial

Wednesday, October 23, 13

Page 61: Programación funcional con haskell

Para saber más...

Wednesday, October 23, 13

Page 62: Programación funcional con haskell

Para saber más...

Wednesday, October 23, 13

Page 63: Programación funcional con haskell

Para saber más...

@Lambda_Mx

Wednesday, October 23, 13

Page 64: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

Wednesday, October 23, 13

Page 65: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

Wednesday, October 23, 13

Page 66: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

Wednesday, October 23, 13

Page 67: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMx

Wednesday, October 23, 13

Page 68: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMxReunión quincenal para practicar Haskell

Wednesday, October 23, 13

Page 69: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMxReunión quincenal para practicar Haskelly platicar sobre Programación Funcional

Wednesday, October 23, 13

Page 70: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMxReunión quincenal para practicar Haskelly platicar sobre Programación Funcional

Wednesday, October 23, 13

Page 71: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMxReunión quincenal para practicar Haskelly platicar sobre Programación Funcional

Wednesday, October 23, 13

Page 72: Programación funcional con haskell

Para saber más...

@Lambda_MxGrupo de Interés en Programación Funcional

en México, D.F.

#HaskellDojoMxReunión quincenal para practicar Haskelly platicar sobre Programación Funcional

Wednesday, October 23, 13

Page 73: Programación funcional con haskell

¿Preguntas?

Wednesday, October 23, 13

Page 74: Programación funcional con haskell

¡Gracias!

Agustín Ramos Fonseca@MachinesAreUs

Wednesday, October 23, 13