Como vamos¶
- Programación funcional es resolver problemas
- Variables inmutables (ligaduras)
- Toda expresión se vuelve un valor
- Funciones de alto orden; Funciones que reciben funciones y retornan funciones
- Recursión como método natural para resolver problemas
- Evaluación de expresiones
- CBV Evaluación por valor o ansiosa, se evaluan todos los parametros antes de invocar la función
- CBN Evaluación por nombre, se evaluan solamente cuando es necesario
Ejemplo evaluación por valor
def f(n:Int, m:Int):Int = g(n+m)+g(n*m)
def g(a:Int):Int = a*a+2*a
//CBV
f(10*3,10+8)
f(30,10+8)
f(30,18)
g(30+18)+g(30*18)
g(48)+g(30*18)
48*48+2*48+g(30*18)
2304+2*48+g(30*18)
2304+96+g(30*18)
2400+g(30*18)
2400+g(540)
2400+540*540+2*540
2400+291600+2*540
294000+2*540
294000+1080
295080
Ejemplo de evaluación por nombre
def f(n: => Int, m: => Int):Int = g(n+m)+g(n*m)
def g(a: => Int):Int = a*a+2*a
//CBN
f(10*3,10+8)
g(10*3+10+8)+g(10*3*(10+8))
(10*3+10+8)*(10*3+10+8)+2*(10*3+10+8)+g(10*3*(10+8))
(30+10+8)*(10*3+10+8)+2*(10*3+10+8)+g(10*3*(10+8))
(40+8)*(10*3+10+8)+2*(10*3+10+8)+g(10*3*(10+8))
48*(10*3+10+8)+2*(10*3+10+8)+g(10*3*(10+8))
48*(30+10+8)+2*(10*3+10+8)+g(10*3*(10+8))
48*(40+8)+2*(10*3+10+8)+g(10*3*(10+8))
48*48+2*(10*3+10+8)+g(10*3*(10+8))
2304+2*(10*3+10+8)+g(10*3*(10+8))
2304+2*(30+10+8)+g(10*3*(10+8))
2304+2*(40+8)+g(10*3*(10+8))
2304+2*48+g(10*3*(10+8))
2304+96+g(10*3*(10+8))
2400+g(10*3*(10+8))
2400+(10*3*(10+8))*(10*3*(10+8))+2*(10*3*(10+8))
2400+(30*(10+8))*(10*3*(10+8))+2*(10*3*(10+8))
2400+(30*18)*(10*3*(10+8))+2*(10*3*(10+8))
2400+540*(10*3*(10+8))+2*(10*3*(10+8))
2400+540*(30*(10+8))+2*(10*3*(10+8))
2400+540*(30*18)+2*(10*3*(10+8))
2400+540*540+2*(10*3*(10+8))
2400+291600+2*(10*3*(10+8))
294000+2*(10*3*(10+8))
294000+2*(30*(10+8))
294000+2*(30*18)
294000+2*540
294000+1080
295080
- Alcance léxico
def f(x:Int, y:Int) { x+y } val x = 10 val y = 20 f(20,30)
En caso tenemos shadowing el x, y de f ocultan el x, y de contexto global.
El x, y de f solo viven en el.