• No se han encontrado resultados

Tema 3: Tipos en Haskell

N/A
N/A
Protected

Academic year: 2021

Share "Tema 3: Tipos en Haskell"

Copied!
33
0
0

Texto completo

(1)

Tema 3: Tipos en Haskell

A. Ch´avez Gonz´alez y C. Graciani D´ıaz

Departamento de Ciencias de la Computaci´on e Inteligencia Artificial

(2)

´Indice

Introducci´on

Tipos simples predefinidos

Tipos Compuestos

(3)

Introducci´

on

Definici´on de funci´on. Elementos: Declaraci´on de tipo, m´etodo de c´omputo, par´ametro formal de la funci´on Haskell es un lenguaje fuertemente tipificado. Un tipo es una colecci´on de valores que tienen algo en com´un, est´an relacionados.

Haskell es un lenguaje de tipo seguro: La inferencia de tipos precede a la evaluaci´on

El tipo seguro evita errores de tipo en la evaluaci´on, pero hay otra clase de errores que no evita

(4)

Introducci´

on

El conjunto de valores, funciones y operadores predefinidos es ampliable, incluso se pueden definir nuevos tipos de datos Ejemplo: Una funci´on de dos argumentos: Observar el tipo de la funci´on, el tipo de los argumentos, la inferencia de tipos . sumaCuadrados :: Integer → Integer → Integer

sumaCuadrados x y = x ∗ x + y ∗ y Main > sumaCuadrados (2 + 2) 3 25 :: Integer

(5)

´Indice

Introducci´on

Tipos simples predefinidos

Tipos Compuestos

(6)
(7)

El tipo Bool

Expresiones l´ogicas cuyo resultado puede ser verdadero o falso. Constructores:

True, False

Funciones y operadores:

(&&) :: Bool -> Bool -> Bool (||) :: Bool -> Bool -> Bool not :: Bool -> Bool

(8)

El tipo Int

N´umeros enteros de precisi´on limitada en el intervalo −229, 229− 1

Funciones y operadores:

(+)(-)(*) :: Int -> Int -> Int (↑) :: Int -> Int -> Int

div, mod :: Int -> Int -> Int abs :: Int -> Int

signum :: Int -> Int negate :: Int -> Int even, odd :: Int -> Bool

Ejemplo: Podemos definir otras funciones a partir de ellas

maximo :: Int -> Int -> Int

(9)

El tipo Integer

Los valores son enteros de precisi´on arbitraria que se usan cuando los n´umeros tratados se salen del rango de los valores del tipo Int

El c´alculo es menos eficiente

Las operaciones disponibles son las mismas que para el tipo de datos Int

(10)

El tipo Float

N´umeros reales. Disponen de una cantidad fija de memoria. Notaci´on:

1.35, -15.345, 1.0 ´o 1 1.5e7, 1.5e - 17 Funciones y operadores:

(+)(−)(∗)(/) :: Float -> Float -> Float (↑) :: Float -> Int -> Float

(∗∗) :: Float -> Float -> Float abs :: Float -> Float

signum :: Float -> Float (-1.0, 0.0, 1.0) negate :: Float -> Float

(11)

El tipo Float

Funciones y operadores:

atan2 :: Float -> Float -> Float log, exp :: Float -> Float

sqrt :: Float -> Float pi :: Float

trucate, round, floor, ceiling :: Float -> Float fromInt :: Int -> Float

(12)

El tipo Double

N´umeros reales en un intervalo mayor que Float M´as precisi´on (doble)

(13)

El tipo Char

Un valor tipo Char representa un car´acter (a’, ’1’, ’ ?’) Caracteres especiales van precedidos por

\ ’\n’ Salto de l´ınea ’\t’ Tabulador ’\’’ Comilla ’\’’’ Comilla doble ’\’ El car´acter \ Funciones:

ord :: Char -> Int chr :: Int -> Char

isUpper, isLower, isDigit, isAlfa :: Char -> Bool toUpper, toLower :: Char -> Char

(14)

El tipo Char

Ejemplos:

Prelude> toUpper ’a’ ’A’ :: Char

Prelude> isUpper ’a’ False :: Bool

Prelude> ord ’a’ 97 :: Int

Prelude> chr 98 ’b’ :: Char

(15)

Operadores de igualdad y orden

Para todos los tipos b´asicos est´an definidos los operadores binarios que devuelven un valor booleano:

(<) mayor que (>=) mayor o igual que (<) menor que (<=) menor o igual que (==) igual que (/=) distinto de

(16)

Operadores de igualdad y orden

El tipo de los dos argumentos debe ser el mismo

Prelude> 10 ≤ 15 Prelude> ’b’ > ’a’ True :: Bool True :: Bool

Prelude> ’x’ == ’y’ Prelude> False < True False :: Bool True :: Bool

Prelude> ’x’ 6= ’y’ Prelude> (1 < 5) && (10 > 9) True :: Bool True :: Bool

Prelude> True < ’a’

ERROR : Type error in application *** Expression : True < ’a’

*** Term : True *** Type : Bool

(17)

Operadores de igualdad y orden

Orden para el tipo Char: may´usculas son menores que min´usculas. Dentro de cada grupo se mantiene el orden alfab´etico.

Orden para el tipo Bool: False menor que True

(==) es el s´ımbolo de igualdad, = se reserva para definir funciones

Para todos los tipos que definen un orden, est´an definidas las funciones max y min

(18)

´Indice

Introducci´on

Tipos simples predefinidos

Tipos Compuestos

(19)
(20)

Adem´as de los tipos simples, Haskell define tipos estructurados que permiten representar colecciones de objetos.

Tuplas

Una tupla es un dato compuesto donde cada componente puede ser de un tipo diferente

Si v1, v2, . . . , vn son valores con tipo t1, t2, . . . , tn, entonces

(v1, v2, . . . , vn)es una tupla con tipo (t1, t2, . . . , tn)

Ejemplos:

Prelude> (’a’, True, 1.5)

(’a’, True, 1.5) :: (Char, Bool, Double) ´

Utiles cuando una funci´on tiene que devolver m´as de un valor predSuc :: Integer -> (Integer -> Integer)

(21)

Listas

Una lista es una colecci´on de cero o m´as elementos todos del mismo tipo. Hay dos constructores u operadores para construir valores para listas:

[] Lista vac´ıa

(:) A˜nade un elemento al princicipo de una lista. Si v1, v2, . . . , vn son valores con tipo t, entonces

v1: (v2 : (. . . (vn−1 : (vn: [])) . . . )) es una lista con tipo [t]

Ejemplos:

1 : [] Lista que almacena un ´unico entero; tipo [Integer ] 3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luego el 1; tipo [Integer ]

(22)

Listas

Una lista es una colecci´on de cero o m´as elementos todos del mismo tipo. Hay dos constructores u operadores para construir valores para listas:

[] Lista vac´ıa

(:) A˜nade un elemento al princicipo de una lista. Si v1, v2, . . . , vn son valores con tipo t, entonces

v1: (v2 : (. . . (vn−1 : (vn: [])) . . . )) es una lista con tipo [t]

Ejemplos:

1 : [] Lista que almacena un ´unico entero; tipo [Integer ] 3 : (1 : []) Lista que almacena dos enteros; primero el 3 y luego el 1; tipo [Integer ]

(23)

Listas

Asociatividad a la derecha del operador (:). La lista x1: x2 : · · · : xn−1: xn: [] representar´a

x1: (x2 : (· · · : (xn−1: (xn : [])) . . . ))

Haskell permite una sintaxis m´as c´omoda [x1, x2, . . . , xn−1, xn]

Ejemplos: Prelude> 1:(2:(3:[])) [1,2,3] :: [Integer] Prelude> 1:2:3:[] [1,2,3] :: [Integer] Prelude> [1,2,3] [1,2,3] :: [Integer]

(24)

Listas

Asociatividad a la derecha del operador (:). La lista x1: x2 : · · · : xn−1: xn: [] representar´a

x1: (x2 : (· · · : (xn−1: (xn : [])) . . . ))

Haskell permite una sintaxis m´as c´omoda [x1, x2, . . . , xn−1, xn]

Ejemplos: Prelude> 1:(2:(3:[])) [1,2,3] :: [Integer] Prelude> 1:2:3:[] [1,2,3] :: [Integer] Prelude> [1,2,3] [1,2,3] :: [Integer]

(25)

Cadenas de caracteres

Una cadena de caracteres es una secuencia de cero o m´as caracteres.

Lista de caracteres 00x1x2. . . xn−1xn00 representa

[0x10,0x20, . . . ,0xn−10 ,0xn0] Ejemplos:

Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’] ‘‘Un Coche’’ :: [Char]

Prelude> ‘‘Un Coche’’ ‘‘Un Coche’’ :: String

Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[] ‘‘Un Coche’’ :: [Char]

(26)

Cadenas de caracteres

Una cadena de caracteres es una secuencia de cero o m´as caracteres.

Lista de caracteres 00x1x2. . . xn−1xn00 representa

[0x10,0x20, . . . ,0xn−10 ,0xn0] Ejemplos:

Prelude> [’U’, ’n’, ’ ’, ’C’,’o’, ’c’, ’h’, ’e’] ‘‘Un Coche’’ :: [Char]

Prelude> ‘‘Un Coche’’ ‘‘Un Coche’’ :: String

Prelude> ’U’: ’n’: ’ ’: ’C’:’o’: ’c’: ’h’: ’e’:[] ‘‘Un Coche’’ :: [Char]

(27)

El constructor de tipo (→)

Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces

t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n

argumentos Ejemplo:

inc :: Integer -> Integer inc x = x + 1

Funciones que devuelven otra funci´on (funciones de orden

superior):

componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)

(28)

El constructor de tipo (→)

Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces

t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n

argumentos Ejemplo:

inc :: Integer -> Integer inc x = x + 1

Funciones que devuelven otra funci´on (funciones de orden superior):

componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)

(29)

El constructor de tipo (→)

Para declarar el tipo correspondiente a las funciones. Si t1, t2, . . . , tn, tr son tipos v´alidos, entonces

t1 → t2→ · · · → tn→ tr es el tipo de una funci´on con n

argumentos Ejemplo:

inc :: Integer -> Integer inc x = x + 1

Funciones que devuelven otra funci´on (funciones de orden superior):

componer :: (Int -> Int) -> (Int -> Int) -> Int -> Int componer f g x = g (f x)

(30)

´Indice

Introducci´on

Tipos simples predefinidos

Tipos Compuestos

(31)
(32)

Parcializaci´

on

Las funciones con m´as de un argumento pueden interpretarse como funciones que toman un argumento y devuelven otra funci´on con un argumento menos.

suma :: Int -> Int -> Int suma x y = x+y

suma toma un entero x y devuelve la funci´on suma x que toma un entero y y devuelve la suma de x e y.

Main> :type suma 2 suma 2 :: Int -> Int Main> :type suma 2 3 suma 2 3 :: Int

(33)

Aplicaci´

on parcial

Las funciones que toman sus argumentos de uno en uno se llaman currificadas (curried).

Las funciones currificadas pueden aplicarse parcialmente. Pueden definirse funciones usando aplicaciones parciales. suc x es el sucesor de x

suc :: Int -> Int suc = suma 1 Main> suc 2 3

Referencias

Documento similar

&#34;No porque las dos, que vinieron de Valencia, no merecieran ese favor, pues eran entrambas de tan grande espíritu […] La razón porque no vió Coronas para ellas, sería

Cedulario se inicia a mediados del siglo XVIL, por sus propias cédulas puede advertirse que no estaba totalmente conquistada la Nueva Gali- cia, ya que a fines del siglo xvn y en

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637:

Después de una descripción muy rápida de la optimización así como los problemas en los sistemas de fabricación, se presenta la integración de dos herramientas existentes

Habiendo organizado un movimiento revolucionario en Valencia a principios de 1929 y persistido en las reuniones conspirativo-constitucionalistas desde entonces —cierto que a aquellas

This section provides guidance with examples on encoding medicinal product packaging information, together with the relationship between Pack Size, Package Item (container)

Por ello, y con la enumeración y explicación de cada una de las características que hemos hecho anteriormente, para la cual hemos utilizado la observación y

Hemos considerado necesario tener dos tipos de tablas almacenadas en nuestra base de datos; un tipo de tabla destinado a registrar los valores de todos los