Slide 1

Slide 1 text

Programaci´ on funcional en Haskell Roberto Bonvallet Departamento de Inform´ atica Universidad T´ ecnica Federico Santa Mar´ ıa Mayo de 2009

Slide 2

Slide 2 text

Programas y diapositivas git clone git:/ /github.com/rbonvall/charla-haskell.git

Slide 3

Slide 3 text

¿Qu´ e hace esto? float z = 0 . 0 ; for ( i = 0 ; i < n ; ++ i ) z = z + a [ i ] ;

Slide 4

Slide 4 text

¿Qu´ e hace esto? float z = 0 . 0 ; for ( i = 0 ; i < n ; ++ i ) z = z + a [ i ] ; ¿Y esto? unsigned int z = 0 ; for ( i = 0 ; i < n ; ++ i ) z = MAX( z , a [ i ] ) ;

Slide 5

Slide 5 text

¿Y esto otro? bool z = false ; for ( i = 0 ; i < n ; ++ i ) z = z | | ( a [ i ] % 2 == 0 ) ;

Slide 6

Slide 6 text

¿Y esto otro? bool z = false ; for ( i = 0 ; i < n ; ++ i ) z = z | | ( a [ i ] % 2 == 0 ) ; ¿Y esto de ac´ a? string z ( ”” ) ; for ( i = 0 ; i < n ; ++ i ) z . append ( a [ i ] ) ;

Slide 7

Slide 7 text

El patr´ on com´ un z = z0 ; for ( i = 0 ; i < n ; ++ i ) z = f(z , a [ i ]) ;

Slide 8

Slide 8 text

En “funcional” sum’ [ ] = 0.0 sum’ ( x : xs ) = x + sum’ xs maximum’ [ ] = 0 maximum’ ( x : xs ) = max x (maximum’ xs ) any even ’ [ ] = False any even ’ ( x : xs ) = ( x ‘mod‘ 2 == 0) | | ( any even ’ xs ) concat ’ [ ] = ”” concat ’ ( x : xs ) = x ++ ( concat ’ xs )

Slide 9

Slide 9 text

Funci´ on foldl sum’ ’ = foldl (+) 0.0 maximum’ ’ = foldl max 0 concat ’ ’ = foldl (++) ”” any even ’ ’ = foldl (λ x y → x | | even y ) False

Slide 10

Slide 10 text

Definici´ on de foldl foldl : : ( a → b → a ) → a → [ b ] → a foldl f z0 [ ] = z0 foldl f z0 ( x : xs ) = foldl f ( f z0 x ) xs

Slide 11

Slide 11 text

Definici´ on de funciones f a c t 0 = 1 f a c t x = x ∗ f a c t ( x − 1)

Slide 12

Slide 12 text

Definici´ on de funciones f a c t 0 = 1 f a c t x = x ∗ f a c t ( x − 1) Operadores son funciones 41 ∗ 200 ( ∗ ) 41 200

Slide 13

Slide 13 text

Definici´ on de funciones f a c t 0 = 1 f a c t x = x ∗ f a c t ( x − 1) Operadores son funciones 41 ∗ 200 ( ∗ ) 41 200 Funciones son operadores elem 2 [ 1 . . 1 0 ] 2 ‘elem ‘ [ 1 . . 1 0 ]

Slide 14

Slide 14 text

Quicksort p < p p ≥ p

Slide 15

Slide 15 text

Quicksort p < p p ≥ p En Haskell qs [ ] = [ ] qs ( x : xs ) = qs ( f i l t e r (

Slide 16

Slide 16 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4

Slide 17

Slide 17 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4 3 2 7 6 5 4 3 2

Slide 18

Slide 18 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4 × 3 2 7 6 5 4 3 2 3 8 14 18 0 4 6 8

Slide 19

Slide 19 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4 × 3 2 7 6 5 4 3 2 3 8 14 18 0 4 6 8 + − − − − → 61

Slide 20

Slide 20 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4 × 3 2 7 6 5 4 3 2 3 8 14 18 0 4 6 8 + − − − − → 61 11−x − − − → −50

Slide 21

Slide 21 text

D´ ıgito verificador como si estuviera en primero 1 4 2 3 0 1 2 4 × 3 2 7 6 5 4 3 2 3 8 14 18 0 4 6 8 + − − − − → 61 11−x − − − → −50 m´ od 11 − − − − − → 5

Slide 22

Slide 22 text

Fibonacci vieja escuela f i b 0 = 1 f i b 1 = 1 f i b x = f i b ( x − 1) + f i b ( x − 2)

Slide 23

Slide 23 text

Fibonacci vieja escuela f i b 0 = 1 f i b 1 = 1 f i b x = f i b ( x − 1) + f i b ( x − 2) Fibonacci perezoso f i b = 1 : 1 : ( zipWith (+) f i b $ t a i l f i b )

Slide 24

Slide 24 text

D´ ıgito verificador, versi´ on 1 dv1 : : String → Char dv1 rut = l e t revRut = reverse rut revDigits = map digitToInt revRut f a c t o r s = cycle [ 2 . . 7 ] products = zipWith ( ∗ ) f a c t o r s revDigits sumOfProducts = sum products d i g i t = (11 − sumOfProducts ) ‘mod‘ 11 in digitToChar d i g i t where digitToChar 10 = ’k ’ digitToChar x = chr $ x + ord ’0 ’

Slide 25

Slide 25 text

D´ ıgito verificador, algunas simplificaciones dv2 : : String → Char dv2 rut = l e t revDigits = map digitToInt $ reverse rut products = zipWith ( ∗ ) ( cycle [ 2 . . 7 ] ) revDigits d i g i t = (11 − sum products ) ‘mod‘ 11 in ”0123456789k” ! ! d i g i t

Slide 26

Slide 26 text

D´ ıgito verificador, m´ as astuto de la cuenta dv3 : : String → Char dv3 rut = ”0k987654321” ! ! ( (sum $ zipWith ( ∗ ) ( cycle [ 2 . . 7 ] ) $ map digitToInt $ reverse rut ) ‘mod‘ 11)

Slide 27

Slide 27 text

Composici´ on f : : a → b g : : b → c ( f ◦ g ) : : a → c

Slide 28

Slide 28 text

Composici´ on f : : a → b g : : b → c ( f ◦ g ) : : a → c Currying zipWith : : ( a → b → c ) → [ a ] → [ b ] → [ c ] zipWith (+) : : (Num a ) ⇒ [ a ] → [ a ] → [ a ] zipWith (+) [ 1 . . 1 0 ] : : (Enum a , Num a ) ⇒ [ a ] → [ a ]

Slide 29

Slide 29 text

D´ ıgito verificador, composici´ on + currying dv4 : : String → Char dv4 rut = ”0k987654321” ! ! ( ( (sum ◦ zipWith ( ∗ ) ( cycle [ 2 . . 7 ] ) ◦ map digitToInt ◦ reverse ) rut ) ‘mod‘ 11)

Slide 30

Slide 30 text

D´ ıgito verificador, propiedades de mod 11 dv5 : : String → Char dv5 rut = ( cycle ”0k987654321” ) ! ! ( (sum ◦ zipWith ( ∗ ) ( cycle [ 2 . . 7 ] ) ◦ map digitToInt ◦ reverse ) rut )

Slide 31

Slide 31 text

D´ ıgito verificador point-free dv6 : : String → Char dv6 = ( ! ! ) ( cycle ”0k987654321” ) ◦ sum ◦ zipWith ( ∗ ) ( cycle [ 2 . . 7 ] ) ◦ map digitToInt ◦ reverse

Slide 32

Slide 32 text

Tipos de datos algebraicos data Point = Point Float Float data Shape = Circle Point Float | Rectangle Point Point surface : : Shape → Float surface ( Circle r ) = pi ∗ r ˆ 2 surface ( Rectangle ( Point x1 y1 ) ( Point x2 y2 ) ) = ( abs $ x2 − x1 ) ∗ ( abs $ y2 − y1 )

Slide 33

Slide 33 text

Tipos parametrizados data Tree a = EmptyTree | Node a ( Tree a ) ( Tree a ) deriving (Show, Read , Eq) singleton : : a → Tree a singleton x = Node x EmptyTree EmptyTree t r e e I n s e r t : : (Ord a ) ⇒ a → Tree a → Tree a t r e e I n s e r t x EmptyTree = singleton x t r e e I n s e r t x (Node a l e f t right ) | x == a = Node x l e f t right | x < a = Node a ( t r e e I n s e r t x l e f t ) right | x > a = Node a l e f t ( t r e e I n s e r t x right )

Slide 34

Slide 34 text

Recursos Haskell Wiki http://www.haskell.org/haskellwiki/ Learn You a Haskell For Great Good! http://learnyouahaskell.com/ Real World Haskell http://book.realworldhaskell.org/read/ Haskell Cafe http://news.gmane.org/gmane.comp.lang. haskell.cafe