I1M2011-T4: Definición de funciones en Haskell

49
Tema 4: Definición de funciones Informática (2011–12) José A. Alonso Jiménez Grupo de Lógica Computacional Departamento de Ciencias de la Computación e I.A. Universidad de Sevilla

description

Se presentan los patrones básicos de definición de funciones en Haskell: por composición, con condicionales, con guardas y con equiparación de patrones. Este es el 4º tema del curso de introducción a Haskell. El código y los restantes temas se encuentran en http://www.cs.us.es/~jalonso/cursos/i1m/temas.html

Transcript of I1M2011-T4: Definición de funciones en Haskell

Page 1: I1M2011-T4: Definición de funciones en Haskell

Tema 4: Definición de funcionesInformática (2011–12)

José A. Alonso Jiménez

Grupo de Lógica ComputacionalDepartamento de Ciencias de la Computación e I.A.

Universidad de Sevilla

Page 2: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funciones

Tema 4: Definición de funciones1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

2 / 24

Page 3: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones por composición

Definiciones por composiciónI Decidir si un carácter es un dígito:

PreludeisDigit :: Char -> Bool

isDigit c = c >= '0' && c <= '9'

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Bool

even n = n `rem` 2 == 0

I Dividir una lista en su n–ésimo elemento:Prelude

splitAt :: Int -> [a] -> ([a],[a])

splitAt n xs = (take n xs, drop n xs)

3 / 24

Page 4: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones por composición

Definiciones por composiciónI Decidir si un carácter es un dígito:

PreludeisDigit :: Char -> Bool

isDigit c = c >= '0' && c <= '9'

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Bool

even n = n `rem` 2 == 0

I Dividir una lista en su n–ésimo elemento:Prelude

splitAt :: Int -> [a] -> ([a],[a])

splitAt n xs = (take n xs, drop n xs)

3 / 24

Page 5: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones por composición

Definiciones por composiciónI Decidir si un carácter es un dígito:

PreludeisDigit :: Char -> Bool

isDigit c = c >= '0' && c <= '9'

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Bool

even n = n `rem` 2 == 0

I Dividir una lista en su n–ésimo elemento:Prelude

splitAt :: Int -> [a] -> ([a],[a])

splitAt n xs = (take n xs, drop n xs)

3 / 24

Page 6: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones por composición

Definiciones por composiciónI Decidir si un carácter es un dígito:

PreludeisDigit :: Char -> Bool

isDigit c = c >= '0' && c <= '9'

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Bool

even n = n `rem` 2 == 0

I Dividir una lista en su n–ésimo elemento:Prelude

splitAt :: Int -> [a] -> ([a],[a])

splitAt n xs = (take n xs, drop n xs)

3 / 24

Page 7: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionalesI Calcular el valor absoluto (con condicionales):

Preludeabs :: Int -> Int

abs n = if n >= 0 then n else -n

I Calcular el signo de un número (con condicionales anidados):Prelude

signum :: Int -> Int

signum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 24

Page 8: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionalesI Calcular el valor absoluto (con condicionales):

Preludeabs :: Int -> Int

abs n = if n >= 0 then n else -n

I Calcular el signo de un número (con condicionales anidados):Prelude

signum :: Int -> Int

signum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 24

Page 9: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionalesI Calcular el valor absoluto (con condicionales):

Preludeabs :: Int -> Int

abs n = if n >= 0 then n else -n

I Calcular el signo de un número (con condicionales anidados):Prelude

signum :: Int -> Int

signum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 24

Page 10: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con ecuaciones con guardas

Definiciones con ecuaciones guardadasI Calcular el valor absoluto (con ecuaciones guardadas):

Preludeabs n | n >= 0 = n

| otherwise = -n

I Calcular el signo de un número (con ecuaciones guardadas):Prelude

signum n | n < 0 = -1

| n == 0 = 0

| otherwise = 1

5 / 24

Page 11: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con ecuaciones con guardas

Definiciones con ecuaciones guardadasI Calcular el valor absoluto (con ecuaciones guardadas):

Preludeabs n | n >= 0 = n

| otherwise = -n

I Calcular el signo de un número (con ecuaciones guardadas):Prelude

signum n | n < 0 = -1

| n == 0 = 0

| otherwise = 1

5 / 24

Page 12: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con ecuaciones con guardas

Definiciones con ecuaciones guardadasI Calcular el valor absoluto (con ecuaciones guardadas):

Preludeabs n | n >= 0 = n

| otherwise = -n

I Calcular el signo de un número (con ecuaciones guardadas):Prelude

signum n | n < 0 = -1

| n == 0 = 0

| otherwise = 1

5 / 24

Page 13: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Constantes como patrones

Tema 4: Definición de funciones

1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

6 / 24

Page 14: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Constantes como patrones

Definiciones con equiparación de patrones: ConstantesI Calcular la negación:

Preludenot :: Bool -> Bool

not True = False

not False = True

I Calcular la conjunción (con valores):Prelude

(&&) :: Bool -> Bool -> Bool

True && True = True

True && False = False

False && True = False

False && False = False

7 / 24

Page 15: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Constantes como patrones

Definiciones con equiparación de patrones: ConstantesI Calcular la negación:

Preludenot :: Bool -> Bool

not True = False

not False = True

I Calcular la conjunción (con valores):Prelude

(&&) :: Bool -> Bool -> Bool

True && True = True

True && False = False

False && True = False

False && False = False

7 / 24

Page 16: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Constantes como patrones

Definiciones con equiparación de patrones: ConstantesI Calcular la negación:

Preludenot :: Bool -> Bool

not True = False

not False = True

I Calcular la conjunción (con valores):Prelude

(&&) :: Bool -> Bool -> Bool

True && True = True

True && False = False

False && True = False

False && False = False

7 / 24

Page 17: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Variables como patrones

Tema 4: Definición de funciones

1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

8 / 24

Page 18: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Variables como patrones

Definiciones con equiparación de patrones: VariablesI Calcular la conjunción (con variables anónimas):

Prelude(&&) :: Bool -> Bool -> Bool

True && True = True

_ && _ = False

I Calcular la conjunción (con variables):Prelude

(&&) :: Bool -> Bool -> Bool

True && x = x

False && _ = False

9 / 24

Page 19: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Variables como patrones

Definiciones con equiparación de patrones: VariablesI Calcular la conjunción (con variables anónimas):

Prelude(&&) :: Bool -> Bool -> Bool

True && True = True

_ && _ = False

I Calcular la conjunción (con variables):Prelude

(&&) :: Bool -> Bool -> Bool

True && x = x

False && _ = False

9 / 24

Page 20: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Variables como patrones

Definiciones con equiparación de patrones: VariablesI Calcular la conjunción (con variables anónimas):

Prelude(&&) :: Bool -> Bool -> Bool

True && True = True

_ && _ = False

I Calcular la conjunción (con variables):Prelude

(&&) :: Bool -> Bool -> Bool

True && x = x

False && _ = False

9 / 24

Page 21: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Tuplas como patrones

Tema 4: Definición de funciones

1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

10 / 24

Page 22: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Tuplas como patrones

Definiciones con equiparación de patrones: TuplasI Calcular el primer elemento de un par:

Preludefst :: (a,b) -> a

fst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> b

snd (_,y) = y

11 / 24

Page 23: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Tuplas como patrones

Definiciones con equiparación de patrones: TuplasI Calcular el primer elemento de un par:

Preludefst :: (a,b) -> a

fst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> b

snd (_,y) = y

11 / 24

Page 24: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Tuplas como patrones

Definiciones con equiparación de patrones: TuplasI Calcular el primer elemento de un par:

Preludefst :: (a,b) -> a

fst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> b

snd (_,y) = y

11 / 24

Page 25: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Tema 4: Definición de funciones

1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

12 / 24

Page 26: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI (test1 xs) se verifica si xs es una lista de 3 caracteres que

empieza por ’a’.

test1 :: [Char ] -> Bool

test1 ['a',_,_] = True

test1 _ = False

I Construcción de listas con (:)[1,2,3] = 1:[2,3] = 1:(2:[3]) = 1:(2:(3:[]))

I (test2 xs) se verifica si xs es una lista de caracteres queempieza por ’a’.

test2 :: [Char ] -> Bool

test2 ('a':_) = True

test2 _ = False

13 / 24

Page 27: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI (test1 xs) se verifica si xs es una lista de 3 caracteres que

empieza por ’a’.

test1 :: [Char ] -> Bool

test1 ['a',_,_] = True

test1 _ = False

I Construcción de listas con (:)[1,2,3] = 1:[2,3] = 1:(2:[3]) = 1:(2:(3:[]))

I (test2 xs) se verifica si xs es una lista de caracteres queempieza por ’a’.

test2 :: [Char ] -> Bool

test2 ('a':_) = True

test2 _ = False

13 / 24

Page 28: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI (test1 xs) se verifica si xs es una lista de 3 caracteres que

empieza por ’a’.

test1 :: [Char ] -> Bool

test1 ['a',_,_] = True

test1 _ = False

I Construcción de listas con (:)[1,2,3] = 1:[2,3] = 1:(2:[3]) = 1:(2:(3:[]))

I (test2 xs) se verifica si xs es una lista de caracteres queempieza por ’a’.

test2 :: [Char ] -> Bool

test2 ('a':_) = True

test2 _ = False

13 / 24

Page 29: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI Decidir si una lista es vacía:

Preludenull :: [a] -> Bool

null [] = True

null (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> a

head (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]

tail (_:xs) = xs

14 / 24

Page 30: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI Decidir si una lista es vacía:

Preludenull :: [a] -> Bool

null [] = True

null (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> a

head (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]

tail (_:xs) = xs

14 / 24

Page 31: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI Decidir si una lista es vacía:

Preludenull :: [a] -> Bool

null [] = True

null (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> a

head (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]

tail (_:xs) = xs

14 / 24

Page 32: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Listas como patrones

Definiciones con equiparación de patrones: ListasI Decidir si una lista es vacía:

Preludenull :: [a] -> Bool

null [] = True

null (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> a

head (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]

tail (_:xs) = xs

14 / 24

Page 33: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Patrones enteros

Tema 4: Definición de funciones

1. Definiciones por composición

2. Definiciones con condicionales

3. Definiciones con ecuaciones con guardas

4. Definiciones con equiparación de patronesConstantes como patronesVariables como patronesTuplas como patronesListas como patronesPatrones enteros

5. Expresiones lambda

6. Secciones

15 / 24

Page 34: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Patrones enteros

Definiciones con equiparación de patrones: EnterosI Predecesor de un número entero:

Preludepred :: Int -> Int

pred 0 = 0

pred (n+1) = n

I Comentarios sobre los patrones n+k:I n+k sólo se equipara con números mayores o iguales que kI Hay que escribirlo entre paréntesis.

16 / 24

Page 35: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesDefiniciones con equiparación de patrones

Patrones enteros

Definiciones con equiparación de patrones: EnterosI Predecesor de un número entero:

Preludepred :: Int -> Int

pred 0 = 0

pred (n+1) = n

I Comentarios sobre los patrones n+k:I n+k sólo se equipara con números mayores o iguales que kI Hay que escribirlo entre paréntesis.

16 / 24

Page 36: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambdaI Las funciones pueden construirse sin nombrarlas mediante las

expresiones lambda.I Ejemplo de evaluación de expresiones lambda:

Prelude> (\x -> x+x) 3

6

17 / 24

Page 37: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y parcializaciónUso de las expresiones lambda para resaltar la parcialización:

I (suma x y) es la suma de x e y.I Definición sin lambda:

suma x y = x+y

I Definición con lambda:

suma' = \x -> (\y -> x+y)

18 / 24

Page 38: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y parcializaciónUso de las expresiones lambda para resaltar la parcialización:

I (suma x y) es la suma de x e y.I Definición sin lambda:

suma x y = x+y

I Definición con lambda:

suma' = \x -> (\y -> x+y)

18 / 24

Page 39: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y parcializaciónUso de las expresiones lambda para resaltar la parcialización:

I (suma x y) es la suma de x e y.I Definición sin lambda:

suma x y = x+y

I Definición con lambda:

suma' = \x -> (\y -> x+y)

18 / 24

Page 40: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones como resultadosUso de las expresiones lambda en funciones como resultados:

I (const x y) es x.I Definición sin lambda:

Preludeconst :: a -> b -> a

const x = x

I Definición con lambda:

const' :: a -> (b -> a)

const' x = \_ -> x

19 / 24

Page 41: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones como resultadosUso de las expresiones lambda en funciones como resultados:

I (const x y) es x.I Definición sin lambda:

Preludeconst :: a -> b -> a

const x = x

I Definición con lambda:

const' :: a -> (b -> a)

const' x = \_ -> x

19 / 24

Page 42: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones como resultadosUso de las expresiones lambda en funciones como resultados:

I (const x y) es x.I Definición sin lambda:

Preludeconst :: a -> b -> a

const x = x

I Definición con lambda:

const' :: a -> (b -> a)

const' x = \_ -> x

19 / 24

Page 43: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones de sólo un usoUso de las expresiones lambda en funciones con sólo un uso:

I (impares n) es la lista de los n primeros números impares.I Definición sin lambda:

impares n = map f [0..n-1]

where f x = 2*x+1

I Definición con lambda:

impares' n = map (\x -> 2*x+1) [0..n-1]

20 / 24

Page 44: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones de sólo un usoUso de las expresiones lambda en funciones con sólo un uso:

I (impares n) es la lista de los n primeros números impares.I Definición sin lambda:

impares n = map f [0..n-1]

where f x = 2*x+1

I Definición con lambda:

impares' n = map (\x -> 2*x+1) [0..n-1]

20 / 24

Page 45: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda y funciones de sólo un usoUso de las expresiones lambda en funciones con sólo un uso:

I (impares n) es la lista de los n primeros números impares.I Definición sin lambda:

impares n = map f [0..n-1]

where f x = 2*x+1

I Definición con lambda:

impares' n = map (\x -> 2*x+1) [0..n-1]

20 / 24

Page 46: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesSecciones

SeccionesI Los operadores son las funciones que se escriben entre sus

argumentos.I Los operadores pueden convertirse en funciones prefijas

escribiéndolos entre paréntesis.I Ejemplo de conversión:

Prelude> 2 + 3

5

Prelude> (+) 2 3

5

I Ejemplos de secciones:Prelude> (2+) 3

5

Prelude> (+3) 2

5

21 / 24

Page 47: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesSecciones

Expresión de secciones mediante lambdasSea * un operador. Entonces

I (*) = \x -> (\y -> x*y)I (x*) = \y -> x*yI (*y) = \x -> x*y

22 / 24

Page 48: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesSecciones

Aplicaciones de seccionesI Uso en definiciones de funciones mediante secciones

suma' = (+)

siguiente = (1+)

inverso = (1/)

doble = (2*)

mitad = (/2)

I Uso en signatura de operadores:Prelude

(&&) :: Bool -> Bool -> Bool

I Uso como argumento:Prelude> map (2*) [1..5]

[2,4,6,8,10]

23 / 24

Page 49: I1M2011-T4: Definición de funciones en Haskell

IM Tema 4: Definición de funcionesBibliografía

Bibliografía1. R. Bird. Introducción a la programación funcional con Haskell.

Prentice Hall, 2000.I Cap. 1: Conceptos fundamentales.

2. G. Hutton Programming in Haskell. Cambridge University Press,2007.

I Cap. 4: Defining functions.3. B. O’Sullivan, D. Stewart y J. Goerzen Real World Haskell.

O’Reilly, 2008.I Cap. 2: Types and Functions.

4. B.C. Ruiz, F. Gutiérrez, P. Guerrero y J.E. Gallardo. Razonandocon Haskell. Thompson, 2004.

I Cap. 2: Introducción a Haskell.5. S. Thompson. Haskell: The Craft of Functional Programming,

Second Edition. Addison-Wesley, 1999.I Cap. 3: Basic types and definitions.

24 / 24