Professional Documents
Culture Documents
Funcionales Perezosos
Gustavo Betarte
Evolucin de Lenguajes de
Programacin Funcionales
Clculo Lambda
Lenguajes de programacin: Lisp, Iswim, ML, Haskell
Caractersticas principales de LPF:
Funciones de alto orden
Evaluacin perezosa
Abstraccin de datos
Ecuaciones y pattern-matching
Clculo Lambda
Un clculo que captura el aspecto computacional de la nocin de
funcin (Church [1932-1933, 1940])
Los lenguajes funcionales modernos pueden ser entendidos como un
embellecimiento sintctico de
Def 1. xpresiones de (puro y no tipado)
e := x | \x.e | e e
Def 2. Variables libres
FV(x) = {x}, FV(e e) = FV(e) U FV(e), FV(\x.e) = FV(e) - {x}
Def 3. Variables ligadas
BV(x) = {}, BV(e e) = BV(e) U BV(e), BV(\x.e) = {x} U BV(e)
e1[x := e1]
e si x FV(e)
(
(
LISP
Un lenguaje algebraico para el procesamiento de listas
McCarthy[1960, 1963]
Contribuciones:
La expresin condicional y su uso en recursin
El uso de listas y funciones de alto orden sobre ellas
El uso de garbage collecting.
El uso de S-expressions para representar programas y datos.
(= n n) => True
(= n m) => False
Que pasa con +, *, 0, 1?
Alternativas:
Codificacin en
Nociones primitivas: semntica usando -reduccin
e := x | c | e1 e2 | \x.e
If True e1 e2 => e1 If False e1 e2 => e2
extensin conservativa: e1 e2 en entonces e1 e2 en
10
Iswim
Mecanizacin de evaluacin de expresiones usando una mquina abstracta.
(SECD, P. Landin[1964]). Subset de ALGOL 60 definido en
Innovaciones
Sintcticas
Notacin infija
Expresiones let y where: definiciones mutuas y recursivas
Uso de layout
Semnticas
Enfasis en generalidad: lenguaje rico sintcticamente en funcin de un lenguaje
pequeo y muy expresivo.
Enfasis en razonamiento ecuacional.
SECD como simple mquina abstracta en la cual se ejecutan expresiones
funcionales.
11
Iswim (2)
extendido con constantes y expresiones let y where .
e := ... | e where d1 ... dn | let d1 ... dn in e
d := x = e | x x1 ... xn = e
let d1 ... dn in e => e where d1 ... dn
x x1 ... xn = e => x = \x1.\x2 ...\xn.e
e where x1 = e1 => (\x1.e) (Y \x1.e1)
e where (x1 = e1) (x2 = e2) ... (xn = en)
=> (\x1.e) (Y \x1.e1)
where x2 = (\x1.e2) (Y \x1.e1)
...
xn = (\x1.en) (Y \x1.e1)
Landin y LF modernos:
qu es el resultado en contraposicin a cmo se calcula
estilo declarativo de programacin es mejor que el imperativo
12
Caractersticas principales de
lenguajes funcionales modernos
Funciones de alto orden
Evaluacin perezosa
Ecuaciones y pattern-matching
Abstraccin de datos
13
prod [] = 1
prod(x:xs) = mul x (prod xs)
abstraccin: add/mul como f, 0/1 como init, sum/prod como fold f init, donde
(fold f init) [] = init
(fold f init) (x:xs) = f x ((fold f init) xs)
sum = fold add 0
14
Evaluacin perezosa
Reglas de reduccin con orden normal son las ms seguras, en el
sentido de que garantizan la produccin de forma normal (si existe)
Permite emular recursin usando Y
Implementacin ingenua puede ser muy ineficiente
(\x. (+ x x)) (* 5 4) => (+ (* 5 4) (* 5 4)) => (+ 20 (* 5 4)) => (+ 20 20) => 40
La expresin (* 5 4) es calculada tantas veces como ocurrencias de x.
Call-by- value: (\x. (+ x x)) (* 5 4) => (\x. (+ x x)) 20) => (+ 20 20) => 40
El argumento es evaluado antes que la -reduccin se efecte.
Desventajas:
Puede evaluar innecesariamente (Ej. (\x.\y.x) 5 ((\x.x x) (\x.x x)))
Exige reduccin especial para implementar recursin
15
20
16
17
Abstraccin de datos
Tipos algebraicos de datos (o concretos)
data List a = Nil | Cons a (List a)
data Tree b = Empty | Node b (List (Tree b))
List, Tree: constructores de tipos ( List :: Type -> Type)
Nil, Cons, Empty, Node: constructores de datos (o simplemente constructores)
Abreviacin (sinnimos)
type Intree =
type Flattener
Tree Int
= Intree
->
[Int]
18
...
first, isempty, ... son visibles en el scope de la declaracin de Queue, pero el
constructor Q y su tipo no lo son.
En Haskell:
module Queue (Queue, first, isempty) where
data Queue a = Q [a]
first (Q as) = last as
isempty (Q []) = True
isempty (Q as) = False
...
19
Ecuaciones y pattern-matching
Uso de razonamiento ecuacional en el diseo y construccin de
programas.
La ausencia de efectos laterales permite el uso de r. e.
Sintaxis tambin puede ayudar: escribir la definicin de una
funcin como una secuencia de ecuaciones.
20
Pattern-matching
case e of
pat1 => e1
pat2 => e2
...
patn => en
pat1 = e1
pat2 = e2
...
patn = en
f
===>
\x. case x of
pat1 => e1
...
patn => en
21
Pattern-matching (2)
Ejemplos:
1) fac 0
= 1
fac n = n * fac (n - 1)
3) length []
= 0
= 1 + length xs
length (x:xs)
4) data Tree a
2) fac 0
= 1
fac n | n>0 = n * fac (n-1)
Leaf a |
fringe (Leaf x)
fringe (Branch left right)
[x]
fringe left ++ fringe right
22
Pattern-matching (3)
Linealidad de parmetros formales
member x []
member x (x:xs)
member x (y:xs)
=
=
=
False
True
member x xs
Problemas:
alleq [x,x,x]
alleq y
True
= False
alleq [1,2,bot] ?
23
Pattern-matching (4)
Conexin de ecuaciones
fac
fac
0
n
= 1
= n * fac (n-1)
24
Pattern-matching (5)
Orden de evaluacin de argumentos.
f 1 1 = 1
f 2 x = 2
g 1 1
g x 2
= 1
= 2
f 2 bot?
g bot 2?
=
=
=
1
2
3
f 0 1 bot (= 1?)
3?)
Disjuntas, pero...
f 1 bot 0 (= 2?)
bot 0 1 (=
25