Semántica denotacional de haskell

Download Report

Transcript Semántica denotacional de haskell

Sistemas de Inferencia
 En haskell no es obligatorio declarar el tipo de las
expresiones.
 Haskell declara el tipo de alguna expresión, el sistema
chequea que el tipo declarado coincide con el tipo
inferido.
Ejemplo de inferencia
 eligeSaludo x = if x then "adios"
else "hola”
 El sistema infiere automáticamente que el tipo es
eligeSaludo::Bool -> String y, si el programador
hubiese declarado que tiene un tipo diferente, el
sistema daría un error de tipos.
Nombres de función: Identificadores y
operadores
Existen dos formas de nombrar una función:
 Identificador ej: sum,product y fact
 símbolo de operador ej: * y +
Palabras reservadas
case
of
where
let in
if
then else
data type
infix
infixl
infixr
primitive class
instance
Operadores
: !
. /
^ |
#
<
-
$
=
%
>
&
?
*
@
+
\
Operadores
Los nombres de operador que comienzan con (:) son
utilizados para funciones constructoras.
:: =
-> ~
..
@
=>
\
|
<-
Operadores de igualdad y orden
 Para todos los tipos básicos.
 > Mayor que
 < Menor que
 == Igual a
 >= Mayor o igual que
 <= Menor o igual que
 /= Distinto de
Evaluación de expresiones
• I)La precedencia
 "2 * 3 + 4”
 "(2 * 3) + 4”
 "2 * (3 + 4)“
Evaluación de expresiones
Para resolver esta ambigüedad:
 Cada operador tiene asignado un valor de precedencia
(un entero entre 0 y 9).
 Esta precedencia la dicta el Standar prelude que es
cargado al arrancar el sistema.
Standar Prelude
Que es el Standar prelude:
 Es la cadena de precedencia de haskell para saber que
operador debe utilizar primero dependiendo de una
enumeración que se le asigna a cada operador.
 Posee una larga colección de funciones: Con dichas
funciones se pueden realizar una gran cantidad de
operaciones útiles
Standar Prelude
Evaluación de expresiones
 II) La asociatividad:
 "1 - 2 - 3“
 "(1 - 2) - 3“ = -4
 "1 - (2 - 3)“ = 2
Asociatividad
 A cada operador se le puede definir una regla de
asociatividad.
 Asociativo a la izquierda: si la expresión "x-y-z" se toma
como "(x-y)-z“
 Asociativo a la derecha: si la expresión "x-y-z" se toma como
"x-(y-z)“
 No asociativo: Si la expresión "x-y-z" se rechaza como un error
sintáctico.
Asociatividad
 Standar prelude el (-) se toma como asociativo a la
izquierda.
 Por lo tanto: "1 - 2 - 3" se tratará como "(1-2)-3".
Asociatividad
Por defecto, todo símbolo de operador se toma como noasociativo y con precedencia 9.
 infixl digito ops Para declarar operadores asociativos
a la izquierda
 infixr digito ops Para declarar operadores asociativos
a la derecha
 infix digito ops Para declarar operadores no
asociativos
Asociatividad
Existen ciertas restricciones en la utilización de estas
declaraciones:
 Sólo pueden aparecer en ficheros de definición de
función que sean cargados en el sistema.
 Para un operador particular, sólo se permite una
declaración
Instrucciones de control
 IF
 Ecuaciones con guardas
Mecanismos de repetición:
 Haskell no posee un mecanismo de repetición, Haskell
se basa en la recursividad.
Reglas de ejecución
• La
característica principal de la programación
funcional es que los cálculos se ven como una función
matemática que hacen corresponder entradas y
salidas.
 Trabaja con llamadas a funciones
 Dichas funciones estan cargadas en el Standar Prelude.
Funciones básicas de Entrada/salida