Tema6.pdf

  • Uploaded by: nicolas franco Carrizo
  • 0
  • 0
  • May 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Tema6.pdf as PDF for free.

More details

  • Words: 2,309
  • Pages: 15
´ Declarativa – Haskell – Informatica ´ Programacion Sistemas – Curso 2003-2004 ´ Pepe Gallardo – Universidad de Malaga

Tema 6. Definiciones de tipos 6.1 Sin´onimos de tipo 6.2 Definiciones de tipos de datos Tipos enumerados Uniones Productos Registros variantes Tipos recursivos 6.3 Tipos Polim´orficos Either Maybe Listas ´ Arboles binarios

´ 6.1 Sinonimos de tipo X Introducen un nuevo nombre para un tipo existente. X Se usa la palabra clave type :

Ejemplos:

type

Entero | {z } Nuevo Nombre

=

Integer

| {z } Tipo Existente

uno :: Entero uno = 1 type DeEnteroEnEntero = Entero → Entero sucesor :: DeEnteroEnEntero sucesor x = x + 1 type ParFlotantes = (Float , Float ) parCeros :: ParFlotantes parCeros = (0.0, 0.0) type String = [Char ]

– – Predefinido en Prelude

X El nuevo nombre del tipo debe comenzar con mayuscula. ´

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.1

6.2 Definiciones de tipos de datos X El programador puede definir nuevos tipos (palabra reservada data ) X Todos los nombres de tipo deben comenzar con mayuscula ´

Tipos enumerados

´ X Constan de un numero finito de valores que se enumeran en la definicion. ´ Ejemplo:

data D´ıaSemana = Lunes | Martes | Mi´e rcoles |Jueves | Viernes | S´ a bado | Domingo deriving Show unD´ıa :: D´ıaSemana unD´ıa = Lunes laborables :: [D´ıaSemana ] laborables = [Lunes , Martes , Mi´e rcoles , Jueves , Viernes ] X D´ıaSemana es un constructor de tipo (nombre del tipo definido). X Los valores que puede tomar una variable del tipo D´ıaSemana son Lunes , Martes , . . . o Domingo . ´ deben empezar con mayuscula. X Son los constructores de datos. Tambien ´ ´ X La clausula deriving Show es necesaria para poder mostrar por pantalla los valores del tipo.

X Un mismo constructor de datos no puede aparecer en dos tipos distintos en un ´ mismo ambito.

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.2

Tipos enumerados (2) Los constructores de datos se pueden usar como patrones:

esFinSemana esFinSemana S ´a bado esFinSemana Domingo esFinSemana

:: = = =

D´ıaSemana → Bool True True False

Otro ejemplo (predefinido):

data Bool = False | True deriving (Show , . . .) infixr 3 && ( && ) :: Bool → Bool → Bool False && x = False True && x = x infixr 2 || ( || ) :: Bool → Bool → Bool False || x = x True || x = True

´ ´ – Pepe Gallardo – Universidad de Malaga Informatica

6.3

Uniones ´ de varios tipos existentes: X Union

data LetraOEntero = Letra Char | Entero Integer deriving Show X Los valores del tipo LetraOEntero son: ¦ Los valores del tipo Char precedidos del constructor Letra ¦ Los valores del tipo Integer precedidos del constructor Entero

unValor :: LetraOEntero unValor = Letra 0 x 0 otroValor :: LetraOEntero otroValor = Entero 15 listaMixta :: [LetraOEntero ] listaMixta = [ Letra 0 a 0 , Entero 10, Entero 12, Letra 0 b 0 ] X Los constructores los elige el programador pero son obligatorios X Cada constructor introducido tiene un tipo (no hay que declararlo) Letra :: Char → LetraOEntero Entero :: Integer →LetraOEntero X Los constructores de datos pueden actuar como patrones y funciones: incLoE :: LetraOEntero → LetraOEntero incLoE (Entero n ) = Entero (n + 1) incLoE (Letra c ) = Letra (chr (1 + ord c )) ? incLoE (Letra 0 a 0 ) Letra 0 b 0 :: LetraOEntero ? incLoE (Entero 10) Entero 11 :: LetraOEntero

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.4

Productos X Tipos con un unico constructor y varias componentes ´ data Racional = Par Integer Integer deriving Show

| {z } | {z }

Numerador

Denom.

X Los valores del tipo Racional son cualesquiera dos valores de tipo Integer precedidos del constructor Par : unMedio :: Racional unMedio = Par 1 2 X Tipo del constructor (no hay que declararlo): Par :: Integer → Integer → Racional Ejemplos:

numerador numerador (Par x denominador denominador (Par

:: Racional → Integer ) = x :: Racional → Integer y) = y

infixl 7 >∗< (>∗<) :: Racional → Racional → Racional (Par a b ) >∗< (Par c d ) = Par (a ∗ c ) (b ∗ d )

? numerador (Par 1 3) 1 :: Integer ? (Par 1 2) >∗< (Par 1 3) Par 1 6 :: Racional

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.5

´ Constructores simbolicos ´ X Si un constructor de datos es binario su nombre puede ser simbolico

X Pueden mejorar legibilidad ´ X Ha de comenzar por el caracter dos puntos (:)

X El constructor se escribe entre las dos componentes del tipo (infijo) infix 9 : / data Racional =

| {z } deriving Show

Integer : / Integer

| {z } Num.

Denom.

X Los valores del tipo Racional son dos valores de tipo Integer con el constructor (: /) infijo: unMedio :: Racional unMedio = 1 : /2 X Tipo del constructor (no hay que declararlo): (: /) :: Integer → Integer → Racional Ejemplos:

numerador numerador (x : / denominador denominador (

:: Racional → Integer ) = x :: Racional → Integer :/ y) = y

infixl 7 >∗< (>∗<) :: Racional → Racional → Racional a : /b >∗< c : /d = (a ∗ c ) : / (b ∗ d ) ? numerador (1 : /3) 1 :: Integer ? 1 : /2 >∗< 1 : /3 1 : /6 :: Racional

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.6

Registros variantes X Mezcla de Uniones, Productos y Enumerados X Permiten expresar distintas formas para valores de un mismo tipo X Cada forma puede tener un numero distinto de componentes ´

Ejemplo: Tipo para representar cuatro clases de figuras

type Radio type Lado type Base type Altura

= = = =

data Figura = | | |

Float Float Float Float C´ırculo Radio Cuadrado Lado Rect´a ngulo Base Altura Punto deriving Show

unC´ırculo :: Figura unC´ırculo = C´ırculo 25 unRect´a ngulo :: Figura unRect´a ngulo = Rect´a ngulo 10 15 listaFiguras :: [Figura ] listaFiguras = [C´ırculo 15, Cuadrado 3, Rect´a ngulo 5 6] ´a rea ´a rea ´a rea ´a rea ´a rea

:: (C´ırculo r ) = (Cuadrado l ) = (Rect´ a ngulo b h ) = Punto =

Figura → Float pi ∗ r ∧ 2 l ∧2 b ∗ h 0

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.7

Tipos recursivos X Alguna componente de un constructor puede tener el tipo que se esta´ definiendo X Permiten definir tipos con cardinalidad infinita

Ejemplo: Los naturales

data Nat = Cero | Suc Nat deriving Show X Un valor de tipo Nat puede tener dos formas ¦ La constante Cero ¦ El constructor Suc seguido de otro valor de tipo Nat

X Iterando la segunda forma se generan los naturales distintos a Cero : Suc Cero | {z } uno

|Suc (Suc {z Cero)}

Suc (Suc (Suc Cero))

dos

tres

|

{z

}

...

X Incluso se puede definir ∞ inf :: Nat inf = Suc inf ? inf Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc (Suc . . .

´ ´ – Pepe Gallardo – Universidad de Malaga Informatica

6.8

Tipos recursivos (2) ´ permite definir funciones que actuen X La recursion sobre el tipo Nat de un modo ´ elegante. Ejemplos:

esPar :: Nat → Bool esPar Cero = True esPar (Suc n ) = not (esPar n ) infixl 6 < + > (< + >) :: Nat → Nat → Nat Cero <+> m = m (Suc n ) < + > m = Suc (n < + > m ) – – ya que (n + 1) + m = (n + m) + 1

infixl 7 < ∗ > (< ∗ >) :: Nat → Nat → Nat Cero < ∗ > m = Cero (Suc n ) < ∗ > m = n < ∗ > m < + > m – – ya que (n + 1) ∗ m = n ∗ m + m

´ Ejemplo de evaluacion: Suc (Suc Cero) < + > Suc Cero ´ de (< + >)} ===> {segunda ecuacion Suc ((Suc Cero) < + > Suc Cero) ´ de (< + >)} ===> {segunda ecuacion Suc (Suc (Cero < + > Suc Cero)) ´ de (< + >)} ===> {primera ecuacion Suc (Suc (Suc Cero ))

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.9

Plegado para el tipo Nat X Muchas funciones sobre el tipo Nat siguen el mismo esquema: esPar :: Nat → Bool esPar Cero = True esPar (Suc n ) = not (esPar n ) aInteger :: Nat → Integer aInteger Cero = 0 aInteger (Suc n ) = 1 + (aInteger n ) X El esquema comun ´ es: fun :: Nat → a fun Cero = e fun (Suc n ) = f (fun n ) ´ de orden superior para este esquema X Una funcion

foldNat :: (a → a ) → a → (Nat → a ) foldNat f e = fun where fun Cero = e fun (Suc n ) = f (fun n ) X O equivalentemente (ya que fun ≡ foldNat f e ) foldNat :: (a → a ) → a → Nat → a foldNat f e Cero = e foldNat f e (Suc n ) = f (foldNat f e n ) ´ de foldNat : X Las funciones originales como concrecion

esPar :: Nat → Bool esPar = foldNat not True aInteger :: Nat → Integer aInteger = foldNat (1+) 0 ´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.10

´ 6.3 Tipos Polimorficos ´ pueden ser polimorficos. ´ Los tipos tambien

Either ´ de otros dos tipos arbitrarios: Tipo predefinido para representar la union

data Either a b = Left a | Right b deriving Show X Los valores de tipo Either a b son los valores de tipo a precedidos del constructor Left y los valores de tipo b precedidos de Right . Ejemplo: Listas con enteros y booleanos:

l1 l1 l2 l2

:: = :: =

[Either Integer Bool ] [Left 1, Right True , Left 3, Left 5] [Either Bool Integer ] [Rigth 2, Left False , Right 5]

Maybe Tipo predefinido para representar valores parciales:

data Maybe a = Nothing | Just a deriving Show X Los valores de tipo Maybe a son los valores de tipo a precedidos de Just y ´ un valor especial que se escribe Nothing ademas X Nothing se suele usar para representar no definido: rec´ıproco :: Float → Maybe Float rec´ıproco 0 = Nothing rec´ıproco x = Just (1/x ) ´ ´ – Pepe Gallardo – Universidad de Malaga Informatica

6.11

Listas ´ ´ Podemos definir una lista polimorfica homogenea (todos los elementos tienen el mismo tipo):

data Lista a = Vac´ıa | Cons

a (Lista a) deriving Show |{z} | {z } cabeza

cola

Las listas definidas tienen dos formas posibles:

X Puede ser la lista vac´ıa, representada por Vac´ıa X Puede ser una lista no vac´ıa, representada por Cons cabeza cola donde la cabeza ha de tener tipo a y la cola tipo Lista a Ejemplos:

l3 l3 l4 l4

:: = :: =

Lista Cons Lista Cons

Integer 1 (Cons 2 (Cons 3 Vac´ıa )) Bool True (Cons True (Cons False Vac´ıa ))

´ Para estructuras lineales es mejor usar un constructor simbolico:

infixr 5 :> data Lista a = Vac´ıa | |{z} a :> (Lista a) deriving Show cabeza

| {z }

l 3 :: Lista Integer l 3 = 1 :> 2 :> 3 :> Vac´ıa

cola

´ ´ predefinidas Ejemplo poco practico, ya que las listas estan

´ ´ – Pepe Gallardo – Universidad de Malaga Informatica

6.12

´ Arboles binarios ´ ´ ´ Podemos definir un arbol binario polimorfico homogeneo con datos en nodos: hijo izq

}|

z

{

´ ´ data ArbolB a = Vac´ıoB | NodoB (ArbolB a) deriving Show

dato en nodo

z}|{ a

z

hijo der

}|

{

´ (ArbolB a)

´ Los arboles definidos tienen dos formas posibles: ´ X Puede ser un arbol binario vac´ıo, representado por Vac´ıoB ´ X Puede ser un arbol binario no vac´ıo, representada por Nodo izq dato der donde ´ izq y der (que representan el subarbol izquierdo y derecho) han de tener tipo ´ ArbolB a y dato , que es el dato almacenado en el nodo, tiene tipo a Ejemplos: ¨ § ¨ ª¥ 3 § ¦ ª Vac´ıoB

¥ 2

¦ R Vac´ıoB

R Vac´ıoB

´ a :: ArbolB Integer a = NodoB ai 2 ad where ai = NodoB Vac´ıoB 3 Vac´ıoB ad = Vac´ıoB ´ sum ArbolB :: ´ sum ArbolB Vac´ıoB = ´ sum ArbolB (NodoB i r d ) =

´ ArbolB Integer → Integer 0 ´ ´ sum ArbolB i + r + sum ArbolB d

´ ´ – Pepe Gallardo – Universidad de Malaga Informatica

6.13

Objetivos del tema El alumno debe: ´ X Saber definir y utilizar sinonimos de tipos

X Saber definir tipos enumerados, uniones, productos, registros variantes y tipos recursivos X Entender las definiciones de tipo X Saber definir funciones sobre tipos definidos X Saber reducir expresiones en las que aparezcan tipos definidos ´ de plegado foldNat y saber definir otras funciones como conX Entender la funcion ´ creciones de esta ´ X Saber definir y utilizar tipos polimorficos ´ X Conocer las reglas lexicas de Haskell

´ ´ Informatica – Pepe Gallardo – Universidad de Malaga

6.14

More Documents from "nicolas franco Carrizo"