Documente Academic
Documente Profesional
Documente Cultură
38
Orden Normal
Se reduce el redex ms externo y
ms a la izquierda.
La funcin es aplicada antes de
evaluar sus argumentos
Pros
Slo se evalan las expresiones
necesarias.
Siempre conduce a la forma normal si
sta existe (normalizante)
Contras
Puede repetirse la evaluacin de un
argumento compuesto
second :: Integer -> Integer -> Integer
second x y = y
$$ second (div 1 0) 2
$ {- definicin de second -}
$$ 2
39
Orden Normal
Se reduce el redex ms externo y
ms a la izquierda.
La funcin es aplicada antes de
evaluar sus argumentos
Pros
Slo se evalan las expresiones
necesarias.
Siempre conduce a la forma normal si
sta existe (normalizante)
Contras
Puede repetirse la evaluacin de un
argumento compuesto
! Paskell usa &:#'A#?9B6 *&/&C.$# D!"#$1 :
! Comblna las venLa[as del orden normal y del apllcauvo
! Ls slmllar al orden normal pero evlLa la reevaluacln:
! Los argumenLos son evaluados una sola vez y su valor comun
es comparudo (sharlng)
! LsLa opumlzacln es poslble en lengua[es puros
40
$ twice (10+2)
$ {- definicin -}
$$(10+2) + (10+2)
$ {- aritmtica entera -}
$$12 + 12
twice :: Integer -> Integer
twice x = x + x
valor
compartido
valor
compartido
! Ls una buena prcuca probar los programas
! Las pruebas ayudan a enconLrar errores "
! CulckCheck es una llbrerla de Paskell que ayuda a
probar los programas
! uenlmos propledades que nuesLros programas deben
cumpllr
! CulckCheck genera casos de prueba y verlca las
propledades para esos casos
41
! ropledades en CulckCheck:
0+9&>&,&+9& ==> >%+"&>*&+9&
! 0+9&>&,&+9& y >%+"&>*&+9& deben ser expreslones
booleanas
! uebe leerse como una lmpllcacln lglca: sl el 0+9&>&,&+9&
es clerLo enLonces el >%+"&>*&+9& Lamblen debe serlo
! CulckCheck solo reallza las verlcaclones para propledades
en las que el 0+9&>&,&+9& es clerLo. Las pruebas con
0+9&>&,&+9& falso son descarLadas
! Se debe usar True sl la propledad es el proplo >%+"&>*&+9&
True ==> >%+"&>*&+9&
42
! Algunas propledades:
p1 x y = True ==> square (x+y) == square x + square y + 2*x*y
p2 x y = True ==> abs (x+y) == abs x + abs y
p3 x y = x>=0 && y>=0 ==> abs (x+y) == abs x + abs y
43
square :: (Num a) => a -> a
square x = x * x
Main> quickCheck (p1 :: Integer -> Integer -> Property)
+++ OK, passed 100 tests.
Main> quickCheck (p2 :: Integer -> Integer -> Property)
*** Failed! Falsifiable (after 2 tests):
1
-1
Main> quickCheck (p3 :: Integer -> Integer -> Property)
+++ OK, passed 100 tests.
Fallo en la prueba:
contraejemplo
Hacemos que
QuickCheck pruebe
nuestra propiedad
con enteros
aleatorios
!!"!" " $!$"%&%&!&%$ "&%$%!"
!!"!" " '!$"'&'!'$'"'
!!()"!"() " '!$"'&'!'$'"'
! Son esLrucLuras de daLos heLerogeneas:
! Ls una coleccln ordenada de valores (componenLes)
! Cada componenLe puede Lener un upo dlsunLo
! SlnLaxls:
! Los valores se separan por comas y se colocan enLre
parenLesls
! Los upos de cada componenLe se separan por comas y
se colocan enLre parenLesls
(True, 2) :: (Bool, Int)
(10, 2, 7) :: (Int, Int, Int)
44
succPred :: Int -> (Int, Int)
succPred x = (x+1, x-1)
succPred 10
$ {- definicin -}
(10+1, 10-1)
$ {- aritmtica -}
(11, 9)
43
! lunclones predenldas que exLraen las componenLes de una Lupla:
fst :: (a,b) -> a
fst (x,y) = x
snd :: (a,b) -> b
snd (x,y) = y
Patrn de una 2-
tupla
a y b son variables de tipo; fst toma
una 2-tupla con componentes de tipos
arbitrarios a y b. Se dice que fst es
polimrfica.
P
r
e
l
u
d
e
P
r
e
l
u
d
e
Indica una
funcin
predefinida
Debe leerse como:
a, b . (a,b) -> a
46
fst (1, True)
$ {- definicin -}
1
snd (1, True)
$ {- definicin -}
True
! una ?'#$& <& @*.$ es un con[unLo de upos que comparLen alguna operacln
! Num es la clase predenlda para los upos numerlcos (enLeros, oLanLes,
raclonales, ...)
! Algunos operadores y funclones solamenLe uenen slgnlcado para upos
numerlcos:
(+), (-), (*) :: (Num a) => a -> a -> a
P
r
e
l
u
d
e
tipo sobrecargado
a debe ser una
instancia de Num; es
decir, debe ser
numrico
Los operandos y el resultado
tienen que ser del mismo tipo
debe leerse como:
a Num . a -> a -> a
47
hup://en.wlklpedla.org/wlkl/1ype_class
Prelude> 1 + 2
3
Prelude> 3.5 * 2.5
8.75
Prelude> 3.5 * 2
7.0
Prelude> 'a' + 'b'
<interactive>:1:0:
$$$$No instance for (Num Char)
$$$$$$arising from a use of `+' at <interactive>:1:0-8
$$$$Possible fix: add an instance declaration for (Num Char)
$$$$In the expression: 'a' + 'b'
$$$$In the definition of `it': it = 'a' + 'b'
suma sobre
Integer
producto sobre
Floating
2 est sobrecargado
Char no es de la clase Num
Type error
48
! Integral es la clase que agrupa los upos de numeros enLeros
! 1lene funclones especlcas para operar con enLeros:
div, mod :: (Integral a) => a -> a -> a
P
r
e
l
u
d
e
Tipo sobrecargado:
debe ser de la clase
Integral
debe leerse como:
a Integral . a -> a -> a
cociente y resto de la
divisin entera
Prelude> div 10 3
3
Prelude> mod 10 3
1
Prelude> div 10.5 2.5
<interactive>:1:9:
Ambiguous type variable `t' in the constraints:
`Fractional t'
arising from the literal `2.5' at <interactive>:1:9-11
`Integral t' arising from a use of `div' at <interactive>:1:0-11
Probable fix: add a type signature that fixes these type variable(s)
Los nmeros Floating no
son Integral.
Type error
49
! Fractional es la clase que agrupa los upos de numeros fracclonarlos:
oLanLes y raclonales (coclenLes de enLeros , ...)
! La funcln esenclal es la dlvlsln:
(/) :: (Fractional a) => a -> a -> a
P
r
e
l
u
d
e
El tipo a debe ser
de la clase
Fractional
Esto debe leerse como:
a Fractional . a -> a -> a
Divisin
fraccionaria
Prelude> 26.25 / 7.5
3.5
Prelude> 10 / 3
3.3333333333333335
10 y 3 estn
sobrecargados
30
twice' :: (Num a) => a -> a
twice' x = x + x
Main> twice' 10
20
Main> twice' 3.25
6.5
Main> twice' True
<interactive>:1:0:
No instance for (Num Bool)
arising from a use of `twice'' at <interactive>:1:0-4
Possible fix: add an instance declaration for (Num Bool)
In the expression: twice True
In the definition of `it': it = twice' True
Esta funcin usa el operador
sobrecargado +; solo puede ser
aplicada a tipos numricos; la
funcin hereda el contexto Num a
31
! Ord es la clase de los upos para los cuales exlsLe una relacln de orden LoLal,
enLre esLos aparecen lnLeger, uouble, 8auonal, 8ool, .
! ClerLos operadores (<, max, .) solo uenen senudo para las lnsLanclas de Ord:
(<), (<=), (>), (>=) :: (Ord a) => a -> a -> Bool
compare :: (Ord a) => a -> a -> Ordering
data Ordering = LT | EQ | GT
max, min :: (Ord a) => a -> a -> a
P
r
e
l
u
d
e
a debe ser una
instancia de Ord
Solo podemos comparar valores
del mismo tipo, y el resultado
siempre ser un booleano
Debe leerse como:
a Ord . a -> a -> Bool
P
r
e
l
u
d
e
mximo y mnimo de dos
valores del mismo tipo,
instancia a su vez de Ord
32
P
r
e
l
u
d
e
Tipo enumerado predefinido:
compare 3 4 $ L1
compare 3.0 3.0000000000000001 $ LC
! Eq es la clase de los upos para los cuales exlsLe una relacln de lgualdad, enLre
esLos aparecen lnLeger, uouble, 8auonal, 8ool, .
! La clase lncluye dos operadores:
(==), (/=) :: (Eq a) => a -> a -> Bool
P
r
e
l
u
d
e
a debe ser una
instancia de Eq
Solo podemos comparar
valores del mismo tipo, y
el resultado siempre ser
un booleano
Debe leerse como:
a Eq . a -> a -> Bool
33
34
Prelude> 1 < 2
True
Prelude> 1 == 2
False
Prelude> 1 /= 2
True
Prelude> compare 1 2
LT
Prelude> compare 10 2
GT
Prelude> compare 1 1
EQ
Prelude> 'a' > z'
False
Prelude> max 3.5 7.8
7.8
Prelude> min 3.5 2.0
2.0
1 es menor que 2
1 no es igual a 2
1 es distinto de 2
1 es Less Than 2
10 es Greater Than 2
1 es EQual a 1
El mayor de 3.5 y 7.8 es 7.8
El menor de 3.5 y 2.0 es 2.0
Eq (==), (/=)
Ord
(<), (<=), (>), (>=)
Num (+), (-), (*)
Integral div mod
Fractional (/)
33
! A menudo es ms senclllo descrlblr una
funcln 6%' 60'9&":
sign 5 $ 1 sign (-2) $ -1
sign 0 $ 0
sign :: (Ord a,Num a) => a -> a
sign x | x > 0 $ = 1
| x < 0 $$= -1
| x == 0 $= 0
Su valor es 1, si el
argumento es positivo
Guardas booleanas
Su valor es -1, si el
argumento es negativo
Su valor es 0, si el
argumento es nulo
36
hup://en.wlklpedla.org/wlkl/Cuard_(compuung)
Atencin al
sangrado . Los
separadores
en la misma
columna
! La denlcln anLerlor:
sign :: (Ord a, Num a) => a -> a
sign x | x > 0 $= $ 1
| x < 0 $$= -1
| x == 0 $= 0
! puede escrlblrse de forma ms expreslva (esulo preferenLe):
sign :: (Ord a, Num a) => a -> a
sign x | x > 0 $ = $1
| x < 0 $$ = -1
| otherwise = 0
otherwise: esta condicin
siempre es cierta. Ser
seleccionada si fallan las
previas
37
otherwise :: Bool
otherwise = True
P
r
e
l
u
d
e
! Las expreslones condlclonales proporclonan una
alLernauva a las formas guardadas:
abs :: (Ord a, Num a) => a -> a
abs x = if x >= 0 then x else x
-- versln con guardas
abs :: (Ord a, Num a) => a -> a
abs x | x >= 0 = x
| otherwise = x
P
r
e
l
u
d
e
38
! Pay funclones denldas solo parclalmenLe:
! Main> reciprocal 0
*** Exception: reciprocal undefined
! LsLo se conslgue vla la funcln error:
reciprocal :: (Fractional a) => a -> a
reciprocal x | x == 0 = error$reciprocal undefined"
$$$$$$ | otherwise $= 1 / x
! Lrror es una funcln pollmrca:
error :: String -> a
39
el valor de tipo String
describe la
excepcin
P
r
e
l
u
d
e
! La palabra reservada where permlLe denlr funclones o varlables
locales, y debe aparecer al nal de la denlcln
circArea :: Double -> Double
circArea r = pi*r^2