programación funcional con haskell

19
Programación Funcional en Haskell Agustín Ramos Fonseca 2a parte

Upload: software-guru

Post on 04-Jul-2015

1.179 views

Category:

Technology


4 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? Este webinar es la continuación de la conferencia que se dio durante el pasado SGVirtual.

TRANSCRIPT

Page 1: Programación funcional con Haskell

Programación Funcional en Haskell

Agustín Ramos Fonseca

2a parte

Page 2: 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.

Page 3: Programación funcional con Haskell

Características• List comprehensions.

• Pattern matching.

• Currying

• Function Composition

• Infinite data structures.

• Agebraic Data Types

• Type classes.

• Applicative Functors

• Monads

Page 4: Programación funcional con Haskell

Ejemplos

Page 5: Programación funcional con Haskell

¿Haskell Sweet Spot?

Page 6: Programación funcional con Haskell

Algoritmos

Page 7: Programación funcional con Haskell

Eight Queens

Page 8: Programación funcional con Haskell

Eight Queens!

isValidSolution sol = all isValid fullPositions

where fullPositions = zip sol [1..8]

isValid pos = null $ intersect fullPositions $ diags pos

diags pos = diag1 pos ++ diag2 pos ++ diag3 pos ++ diag4 pos

diag1 (r,c) = [(r',c') | r' <- [r-1,r-2..1], r' >= 1, c' <- [c-1,c-2..1], c' >= 1, r'-c' == r-c ]

diag2 (r,c) = [(r',c') | r' <- [r+1..8], r' <= 8, c' <- [c+1..8], c' <= 8, r'-c' == r-c ]

diag3 (r,c) = [(r',c') | r' <- [r+1..8], r' <= 8, c' <- [c-1,c-2..1], c' >= 1, r'+c' == r+c ]

diag4 (r,c) = [(r',c') | r' <- [r-1,r-2..1], r' >= 1, c' <- [c+1..8], c' <= 8, r'+c' == r+c ]

!

eightQueens = filter isValidSolution $ permutations [1..8]

Page 9: Programación funcional con Haskell

Knights Tour

Page 10: Programación funcional con Haskell

Knights Tourtype Position = (Int,Int)

type Solution = [Position]

!

possibleMovs :: Int -> Position -> [Position]

possibleMovs n (r,c) = [(r',c') | r' <- [r-2..r+2],

c' <- [c-2..c+2],

isLMovement (r’,c'),

isWithinBoard (r',c')]

where isLMovement (r',c') = abs(r-r') + abs(c-c') == 3

isWithinBoard (r',c') = r' >= 1 && r' <= n && c' >= 1 && c' <= n

Page 11: Programación funcional con Haskell

Knights Tourtours :: Int -> Position -> [Solution]

tours n from = tours' n from [[from]]

where tours' n from sols = filter fullTour $ concat $ solutions n from sols

solutions n from sols = parMap rpar (completeSols sols) $ possibleMovs n from

completeSols sols m = if isNewPosition m sols

then tours' n m $ appendToSolutions sols m

else sols

fullTour s = length s == n*n

isNewPosition p = all (isNothing . elemIndex p)

appendToSolutions [] mov = [[mov]]

appendToSolutions sols mov = map (\sol -> sol ++ [mov] ) sols

!knightsTour n = concat $ parMap rpar (tours n) allPositions

where allPositions = [(r,c) | r <- [1..n], c <- [1..n]]

Page 12: Programación funcional con Haskell

Lattice Paths

http://projecteuler.net/problem=15

Page 13: Programación funcional con Haskell

Lattice Pathsimport Control.Monad.Memo

!pathsm 0 0 = return 0

pathsm 0 _ = return 1

pathsm _ 0 = return 1

pathsm r d = do

r1 <- for2 memo pathsm (r - 1) d

d1 <- for2 memo pathsm r (d -1)

return (r1 + d1)

!evalPathsm :: (Num n, Ord n) => n -> n -> n

evalPathsm r d = startEvalMemo $ pathsm r d

!runPathsm n = evalPathsm n n

Page 14: Programación funcional con Haskell

Proyectos Interesantes

Page 15: Programación funcional con Haskell

HAXL

http://j.mp/1bWl9Oz

Page 16: Programación funcional con Haskell

Elm

http://elm-lang.org/

Page 17: Programación funcional con Haskell

Porque... #SoyPunk

Page 18: Programación funcional con Haskell

¿Preguntas?

Page 19: Programación funcional con Haskell

¡Gracias!

Agustín Ramos Fonseca @MachinesAreUs