2. Un programa consiste en la definición de una o más funciones.
Programación Funcional:
El computador actúa como un evaluador; su tarea es evaluar
expresiones y mostrar el resultado (emparejamiento + reescr.)
Las funciones devuelven valores, no computan respuestas.
Se puede trabajar con igualdad semántica:
Ejemplo: f :: Integer Integer
f0=0
f 1 = f0
> f1
0.
La unificación semántica consistiría en:
Unificación sintáctica + Reescritura
2
3. Curry
Características de la programación funcional:
Expresiones anidadas.
Tipos polimórficos.
Evaluación perezosa.
Funciones de primer orden.
Selección del modo de evaluación.
Búsqueda encapsulada.
…
3
4. Curry:
Ejemplos:
append [] ys = ys
append (x:xs) ys = x : append xs ys
append [0,1] [2,3]
Haskell [0,1,2,3]
Curry {} [0,1,2,3]
append L M =:= [0,1]
Haskell no puede evaluarlo.
Curry {L= [ ], M=[0,1]} | {L= [0], M=[0]} | {L= [0,1], M=[
]}
4
5. Ejemplos:
fac n | n ==0 =1
| otherwise = fac (n-1)*n
donde la igualdad ‘==’ se evalúa a True si ambas expresiones son
iguales y constructoras y la constante predefinida otherwise tiene el
valor True. En este caso, se puede usar también la instrucción
condicional if-then-else:
fac n = if n==0 then 1 else fac (n-1)*n
5
6. Ejemplo:
let a=3*b
b=6 Se reduce al valor 72.
in 4*a
exp b n = if n == 0 then 1
else if even n then square (exp b (n ‘div’ 2))
else b * (exp b (n-1))
where even n = n ‘mod’ 2 == 0
square n = n*n
Ejemplo:
expr1 = getLine >>= putStrLn ; toma una línea de la
entrada estándar y la escribe en la salida estándar.
try :: (a -> Success) -> [a -> Success]
6
7. Una lista que contiene más de un elemento.
Ejemplo: f eval flex
fa=c
fb=d
try (x -> f x = : = d) se reduce a la lista:
[x → x =:= a & f a =:= c, x → x =:= b & f b =:= d]
OTROS OPERADORES QUE PODEMOS INDENTIFICAR EN EL EJEMPLO
best :: (a -> Constraint) -> (a -> a -> Bool) -> [a -> Constraint]
one :: (a -> Constraint) -> [a -> Constraint]