Tema 4: Definición de funciones - Informática (2019 20)jalonso/cursos/i1m-19/temas/tema-4.pdf ·...

Post on 05-Oct-2020

12 views 0 download

Transcript of Tema 4: Definición de funciones - Informática (2019 20)jalonso/cursos/i1m-19/temas/tema-4.pdf ·...

Tema 4: Definición de funcionesInformática (2019–20)

José A. Alonso Jiménez

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

Universidad de Sevilla

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 patrones

5. Expresiones lambda

6. Secciones

2 / 22

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 -> BoolisDigit c = c >= ’0’ && c <= ’9’

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Booleven 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 / 22

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 -> BoolisDigit c = c >= ’0’ && c <= ’9’

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Booleven 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 / 22

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 -> BoolisDigit c = c >= ’0’ && c <= ’9’

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Booleven 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 / 22

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 -> BoolisDigit c = c >= ’0’ && c <= ’9’

I Decidir si un entero es par:Prelude

even :: (Integral a) => a -> Booleven 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 / 22

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionales

I Calcular el valor absoluto (con condicionales):Prelude

abs :: Int -> Intabs n = if n >= 0 then n else -n

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

signum :: Int -> Intsignum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 22

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionales

I Calcular el valor absoluto (con condicionales):Prelude

abs :: Int -> Intabs n = if n >= 0 then n else -n

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

signum :: Int -> Intsignum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 22

IM Tema 4: Definición de funcionesDefiniciones con condicionales

Definiciones con condicionales

I Calcular el valor absoluto (con condicionales):Prelude

abs :: Int -> Intabs n = if n >= 0 then n else -n

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

signum :: Int -> Intsignum n = if n < 0 then (-1) else

if n == 0 then 0 else 1

4 / 22

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

Definiciones con ecuaciones guardadas

I Calcular el valor absoluto (con ecuaciones guardadas):Prelude

abs 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 / 22

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

Definiciones con ecuaciones guardadas

I Calcular el valor absoluto (con ecuaciones guardadas):Prelude

abs 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 / 22

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

Definiciones con ecuaciones guardadas

I Calcular el valor absoluto (con ecuaciones guardadas):Prelude

abs 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 / 22

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 patrones

5. Expresiones lambda

6. Secciones

6 / 22

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

Constantes como patrones

Definiciones con equiparación de patrones: Constantes

I Calcular la negación:Prelude

not :: Bool -> Boolnot True = Falsenot False = True

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

(&&) :: Bool -> Bool -> BoolTrue && True = TrueTrue && False = FalseFalse && True = FalseFalse && False = False

7 / 22

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

Constantes como patrones

Definiciones con equiparación de patrones: Constantes

I Calcular la negación:Prelude

not :: Bool -> Boolnot True = Falsenot False = True

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

(&&) :: Bool -> Bool -> BoolTrue && True = TrueTrue && False = FalseFalse && True = FalseFalse && False = False

7 / 22

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

Constantes como patrones

Definiciones con equiparación de patrones: Constantes

I Calcular la negación:Prelude

not :: Bool -> Boolnot True = Falsenot False = True

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

(&&) :: Bool -> Bool -> BoolTrue && True = TrueTrue && False = FalseFalse && True = FalseFalse && False = False

7 / 22

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 patrones

5. Expresiones lambda

6. Secciones

8 / 22

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

Variables como patrones

Definiciones con equiparación de patrones: Variables

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

(&&) :: Bool -> Bool -> BoolTrue && True = True_ && _ = False

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

(&&) :: Bool -> Bool -> BoolTrue && x = xFalse && _ = False

9 / 22

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

Variables como patrones

Definiciones con equiparación de patrones: Variables

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

(&&) :: Bool -> Bool -> BoolTrue && True = True_ && _ = False

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

(&&) :: Bool -> Bool -> BoolTrue && x = xFalse && _ = False

9 / 22

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

Variables como patrones

Definiciones con equiparación de patrones: Variables

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

(&&) :: Bool -> Bool -> BoolTrue && True = True_ && _ = False

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

(&&) :: Bool -> Bool -> BoolTrue && x = xFalse && _ = False

9 / 22

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 patrones

5. Expresiones lambda

6. Secciones

10 / 22

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

Tuplas como patrones

Definiciones con equiparación de patrones: Tuplas

I Calcular el primer elemento de un par:Prelude

fst :: (a,b) -> afst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> bsnd (_,y) = y

11 / 22

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

Tuplas como patrones

Definiciones con equiparación de patrones: Tuplas

I Calcular el primer elemento de un par:Prelude

fst :: (a,b) -> afst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> bsnd (_,y) = y

11 / 22

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

Tuplas como patrones

Definiciones con equiparación de patrones: Tuplas

I Calcular el primer elemento de un par:Prelude

fst :: (a,b) -> afst (x,_) = x

I Calcular el segundo elemento de un par:Prelude

snd :: (a,b) -> bsnd (_,y) = y

11 / 22

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 patrones

5. Expresiones lambda

6. Secciones

12 / 22

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 ] -> Booltest1 [’a’,_,_] = Truetest1 _ = 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 ] -> Booltest2 (’a’:_) = Truetest2 _ = False

13 / 22

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 ] -> Booltest1 [’a’,_,_] = Truetest1 _ = 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 ] -> Booltest2 (’a’:_) = Truetest2 _ = False

13 / 22

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 ] -> Booltest1 [’a’,_,_] = Truetest1 _ = 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 ] -> Booltest2 (’a’:_) = Truetest2 _ = False

13 / 22

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] -> Boolnull [] = Truenull (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> ahead (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]tail (_:xs) = xs

14 / 22

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] -> Boolnull [] = Truenull (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> ahead (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]tail (_:xs) = xs

14 / 22

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] -> Boolnull [] = Truenull (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> ahead (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]tail (_:xs) = xs

14 / 22

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] -> Boolnull [] = Truenull (_:_) = False

I Primer elemento de una lista:Prelude

head :: [a] -> ahead (x:_) = x

I Resto de una lista:Prelude

tail :: [a] -> [a]tail (_:xs) = xs

14 / 22

IM Tema 4: Definición de funcionesExpresiones lambda

Expresiones lambda

I Las funciones pueden construirse sin nombrarlas mediante lasexpresiones lambda.

I Ejemplo de evaluación de expresiones lambda:Prelude> (\x -> x+x) 36

15 / 22

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)

16 / 22

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)

16 / 22

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)

16 / 22

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 -> aconst x = x

I Definición con lambda:

const’ :: a -> (b -> a)const’ x = \_ -> x

17 / 22

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 -> aconst x = x

I Definición con lambda:

const’ :: a -> (b -> a)const’ x = \_ -> x

17 / 22

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 -> aconst x = x

I Definición con lambda:

const’ :: a -> (b -> a)const’ x = \_ -> x

17 / 22

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]

18 / 22

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]

18 / 22

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]

18 / 22

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 + 35Prelude> (+) 2 35

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

19 / 22

IM Tema 4: Definición de funcionesSecciones

Expresión de secciones mediante lambdasSea * un operador. EntoncesI (*) = \x -> (\y -> x*y)I (x*) = \y -> x*yI (*y) = \x -> x*y

20 / 22

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]

21 / 22

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.

22 / 22