programación funcional con haskell

Post on 04-Jul-2015

1.179 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

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

Programación Funcional en Haskell

Agustín Ramos Fonseca

2a parte

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.

Características• List comprehensions.

• Pattern matching.

• Currying

• Function Composition

• Infinite data structures.

• Agebraic Data Types

• Type classes.

• Applicative Functors

• Monads

Ejemplos

¿Haskell Sweet Spot?

Algoritmos

Eight Queens

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]

Knights Tour

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

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]]

Lattice Paths

http://projecteuler.net/problem=15

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

Proyectos Interesantes

HAXL

http://j.mp/1bWl9Oz

Elm

http://elm-lang.org/

Porque... #SoyPunk

¿Preguntas?

¡Gracias!

Agustín Ramos Fonseca @MachinesAreUs

top related