Functional Reactive Programming
Santiago Rodríguez Sordo
@santiagorodsor
Let`s react
Functional Programming
?
la semántica reactiva
está basada en la programación funcional
¿nuevo lenguaje?
¿seguro?
¿puede tu lenguaje hacer algo así?
alert("I'd like some Spaghetti!");
alert("I'd like some Chocolate Moose!");
function SwedishChef( food )
{
alert("I'd like some " + food + "!");
}
SwedishChef("Spaghetti");
SwedishChef("Chocolate Moose");
¿puede tu lenguaje hacer algo así?
Cook( "lobster",
"water",
function(x) { alert("pot " + x); }
);
Cook( "chicken",
"coconut",
function(x) { alert("boom " + x);}
);
alert("get the lobster");
PutInPot("lobster");
PutInPot("water");
alert("get the chicken");
BoomBoom("chicken");
BoomBoom("coconut");
function Cook( i1, i2, f )
{
alert("get the " + i1);
f(i1);
f(i2);
}
Cook( "lobster", "water", PutInPot );
Cook( "chicken", "coconut", BoomBoom );
funciones anónimas como argumentos
¿puede tu lenguaje hacer algo así?
var a = [1,2,3];
for (i=0; i<a.length; i++)
{
a[i] = a[i] * 2;
}
function map(fn, a)
{
for (i = 0; i < a.length; i++)
{
a[i] = fn(a[i]);
}
}
map( function(x){return x*2;}, a );
map( alert, a );
funciones anónimas como argumentos
¿puede tu lenguaje hacer algo así?
function sum(a)
{
var s = 0;
for (i = 0; i < a.length; i++)
s += a[i];
return s;
}
function join(a)
{
var s = "";
for (i = 0; i < a.length; i++)
s += a[i];
return s;
}
alert(sum([1,2,3]));
alert(join(["a","b","c"]));
function reduce(fn, a, init)
{ var s = init;
for (i = 0; i < a.length; i++)
s = fn( s, a[i] );
return s;
}
function sum(a)
{ return reduce(
function(a, b){ return a + b; },
a,
0 );
}
function join(a)
{ return reduce(
function(a, b){ return a + b; },
a,
"" );
}
funciones anónimas como argumentos
¿puede tu lenguaje hacer algo así?
function pair(a)
{ var s = [];
for (i = 0; i < a.length; i++){
if (a[i]%2==0){
s.push(a[i]);
}
}
return s;
}
alert(pair([1,2,3]));
function filter(fn, a)
{ var s = init;
for (i = 0; i < a.length; i++)
s = fn( s, a[i] );
return s;
}
function pair(a)
{ return filter(
function(x){ return (x%2==0); },
a);
}
funciones anónimas como argumentos
map
reduce
filter
funciones
"first class citizen"
"se pueden pasar como argumento"
map( function(x){return x*2;}, a );
map( alert, a );
funciones puras
sin efectos colaterales
mismas salidas para mismas entradas
a = b + c
fáciles de concatenar
x = y + z
a = x - b
a = y + z - b
sin estado
inmutables
funciones puras
mejor de 1 sólo argumento
(x, y) → x + y
x → (y → x + y)
prueba con curry
Haskell Curry (1900 – 1982)
function(x) {
return function(y) {
return x + y;
};
}
function(x, y) {
return x + y;
}
(x, y) → x + y
x → (y → x + y)
curry + "f-class citizen"
function g(h) {
return function(y) {
return h(h(y));
};
}
1000 === g(function(x) {
return x * x;
})(10);
function g(h) {
return function(y) {
return h(h(y));
};
}
var n = g(function(x) {
return x * x;
});
1001000 === n(10) + n(100);
=
funciones de orden superior
funciones de orden superior
funciones que reciben funciones y devuelven funciones
map
reduce
filter
design patterns
muchos patrones son específicos del paradigma,
resuelven problemas específicos del paradigma...
...cada paradigma tiene sus patrones
imperativo
cómo
declarativo
qué
~ otro paradigma ~
var a = [1,2,3];
for (i=0; i<a.length; i++)
{
a[i] = a[i] * 2;
}
map( function(x){return x*2;}, a );
necesitamos
- trabajar con funciones puras
- un lenguaje con funciones como first-class citizen
- funciones de orden superior
- paradigma declarativo
be Reactive
"propagación del cambio"
Functional Reactive Programming
FRP = FP + RP
aplicación
take input and produce output
input - transform- output
todo el tiempo
mismas entradas dan mismas salidas
siempre input - transform - output
+
... pero las aplicaciones
dan outputs diferentes ...
... porque en las aplicaciones
los inputs varian con el tiempo.
el estado de la aplicación es la combinación de los inputs
clásicamente el programador conoce el estado e indica cómo hace la máquina
aquí el programador indica qué hace la máquina en función de los inputs
un puñado de clicks
una secuencia de entrada
un array de eventos
stream
"los patrones son vuestros amigos"
patrones relacionados con emitir y recibir
Iterator y Observer
"los patrones son vuestros amigos"
Iterador:
Wikipedia:
"define una interfaz que declara los métodos necesarios para acceder secuencialmente a un grupo de objetos de una colección."
Observer:
Wikipedia:
"define una dependencia del tipo uno-a-muchos entre objetos, de manera que cuando uno de los objetos cambia su estado, notifica este cambio a todos los dependientes."
"los patrones son vuestros amigos"
Iterador
Observer
productor tiene el control
receptor tiene el control
Observable
next,
error,
last
next,
error,
last
Observable
Using Rx, developers represent
asynchronous data streams with Observables,
query asynchronous data streams using LINQ operators, and
parameterize the concurrency in the asynchronous data streams using Schedulers.
Simply put, Rx = Observables + LINQ + Schedulers.
Reactive Extensions Library
Reactive Extensions
Reactive Extensions
Marble Diagrams
stream - function - stream
Marble Diagrams
El sistema se convierte en una gran función pura
"eventos se interpretan como datos entrantes, el sistema responde en tiempo real"
nada nuevo
FRP es el nuevo OOP
- Internet had 280 million users.
- Java se vendía bien por el "escríbelo una vez, ejecutalo en cualquier sitio"
(Cualquier sitio en el que se instalar JVM, sin conceptos de Cloud ni IoT)
1999
- J2EE, SOA, and XML
- The Internet had 1 billion users.
- Facebook had 5.5 million users.
- YouTube was a newborn (February, 2005).
- Twitter wasn’t alive yet (2006).
- Netflix had yet to introduce video streaming (2007).
2005
- 2,950,000,000 (2.95 billion)
- China alone has 640 million Internet users.
- The United States has 280 million.
- Two of the most popular websites today:
- Facebook — 1.3 billion users.
- Twitter — 270 million users.
2014
¿responderá correctamente la programación reactiva?
actualmente
enorme cantidad de eventos en tiempo real que dan alta interactividad al usuario.
nos enfrentamos a enormes problemas de escala, expectativas y confianza en el software de nuestra vida cotidiana.
se puede ver como algunos paradigmas del pasado puede que no se escalen bien en el presente, y seguramente no en el futuro.
nada nuevo
FRP es el nuevo OOP
lo nuevo es todo lo demás
must:
- A responsive application is the goal.
- A responsive application is both scalable and resilient.
- A message-driven architecture is the foundation of scalable, resilient, and ultimately responsive systems.
Responsive:
la app responde bajo cualquier circunstancia, en cualquier dispositivo, en cualquier momento.
Resiliente:
"capaz de sobreponerse a situaciones adversas o contratiempos e incluso salir fortalecido"
Escalable:
capaz de crecer bajo demanda sin suponer un riesgo al resto del sistema, ni un coste desmesurado
conducido por eventos:
observa o escucha eventos que "pasan" a los que espera y que no deja bloqueados
"Systems built as Reactive Systems are more flexible, loosely-coupled and scalable.
This makes them easier to develop and amenable to change.
They are significantly more tolerant of failure and when failure does occur they meet it with elegance rather than disaster.
Reactive Systems are highly responsive, giving users effective interactive feedback."
los primeros
hay mucho más
- Javascript- UDON ttp://extralogical.net/projects/udon/
- Haskell http://tryhaskell.org/
- F# http://lifebeyondfife.com/82-f-sharp.html/
hay mucho más
- JS con NoR Analogía con circuitos http://vic.github.io/NoR/
- RP en JS sin fw http://www.scriptol.com/javascript/reactive-programming.php
- JS Reactor https://github.com/fynyky/reactor.js
- JS Knockout http://knockoutjs.com/
- Bacon.js http://blog.flowdock.com/2013/01/22/functional-reactive-programming-with-bacon-js/
- JS plano http://engineering.silk.co/post/80056130804/reactive-programming-in-javascript
- JS fw http://www.flapjax-lang.org/
- Obj-C Reactive Cocoa http://blog.maybeapps.com/post/42894317939/input-and-output
- Haskell + Banana http://alfredodinapoli.wordpress.com/2011/12/24/functional-reactive-programming-kick-starter-guide/
- Groovy - Android http://open.blogs.nytimes.com/2014/08/18/getting-groovy-with-reactive-android/?php=true&type=blogs&_r=0
- Unity & Rx http://www.rivellomultimediaconsulting.com/unity3d-reactive-extensions-1/
hay mucho más
- Los programas funcionales raramente se pudren http://michaelochurch.wordpress.com/2012/12/06/functional-programs-rarely-rot/
- Functional Programming para todos http://www.defmacro.org/ramblings/fp.html
- Fp books http://alexott.net/en/fp/books/
- Aplicaciones reactivas en js http://conal.net/fran/tutorial.htm
- Introduction to Rx http://www.introtorx.com/content/v1.0.10621.0/00_Foreword.html
- 101 Rx Samples http://rxwiki.wikidot.com/101samples
- The introducction to Reactive Programming you have been missing https://gist.github.com/staltz/868e7e9bc2a7b8c1f754
- Coursera con Scala: https://class.coursera.org/reactive-001
¿a quién seguir?
- @benjchristensen
- @ReactiveX
- Erik Meijer :@headinthebox
- @jhusain
Muchas
Gracias
Functional Reactive Programming (Spanish)
By Santiago Rodriguez Sordo
Functional Reactive Programming (Spanish)
Deck about Functional Reactive Programming on KIT context @sngular (ex @medianet ) www.sngular.team
- 2,916