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