ventajas reactivas reactiva programming programacion desventajas caracteristicas arquitectura aplicaciones programming-languages functional-programming reactive-programming frp

programming languages - reactivas - ¿Es correcta la representación de ''Señal'' de la programación reactiva funcional?



programacion reactiva ventajas y desventajas (1)

Desafortunadamente, la unión de "evento" y "comportamiento" en una sola "señal" de entidad no funciona tan bien.

La mayoría de las implementaciones de FRP basadas en señales que conozco terminan creando un tipo de "evento" adicional en la línea de

type Event a = Signal (Maybe a)

Entonces, el concepto de eventos no desaparece, y no hay una simplificación real. De hecho, diría que el tipo de señal es una complicación semántica. Las señales solo son populares porque son más fáciles de implementar.

El principal argumento en contra de las señales es que no pueden representar comportamientos de tiempo continuo, porque tienen que atender a los eventos discretos. En la visión original de Conal Elliott, los comportamientos eran simples funciones continuas del tiempo.

type Behavior a = Time -> a -- = function that takes the current time as parameter and returns -- the corresponding value of type a

En contraste, las señales siempre están discretizadas y usualmente asociadas con un paso de tiempo fijo. (Es posible implementar eventos y comportamientos en la parte superior de una señal de paso de tiempo variable, pero no es una buena abstracción por sí misma). Compara esto con un flujo de eventos

type Event a = [(Time,a)] -- list of pairs of the form (current time, corresponding event value)

donde los eventos individuales no necesariamente ocurren en intervalos de tiempo espaciados regularmente.

El argumento para la distinción entre comportamientos y eventos es que su API es bastante diferente. El punto principal es que tienen diferentes tipos de productos:

(Behavior a , Behavior b) = Behavior (a,b) (Event a , Event b ) = Event (a :+: b)

En palabras: un par de comportamientos es lo mismo que un comportamiento de pares, pero un par de eventos es lo mismo que un evento de cualquier componente / canal. Otro punto es que hay dos operaciones.

(<*>) :: Behavior (a -> b) -> Behavior a -> Behavior b apply :: Behavior (a -> b) -> Event a -> Event b

Que tienen casi el mismo tipo, pero semánticas bastante diferentes. (La primera actualiza el resultado cuando cambia el primer argumento, mientras que el segundo no lo hace).

Para resumir: las señales se pueden usar para implementar FRP y son valiosas para experimentar con nuevas técnicas de implementación, pero los comportamientos y eventos son una mejor abstracción para las personas que solo quieren usar FRP.

(Revelación completa: he implementado una biblioteca de FRP llamada reactive-banana en Haskell).

He estado investigando FRP y encontré un montón de implementaciones diferentes. Un modelo que he visto es uno al que me referiré como la representación de ''Señal''. Este esencial combina Eventos y Comportamientos en una sola entidad.

En primer lugar, una señal es un objeto que valor es un comportamiento. En segundo lugar, una Señal tiene un ''flujo'' de Eventos que puede verse y operarse como una estructura de datos estándar (puede usar ''cada'', ''mapa'' y ''filtro'', etc. en la Señal para definir cómo reaccionan los Eventos). Por ejemplo, puedo hacer esto (donde ''tiempo'' es una representación de señal del tiempo):

time.each { t => print(t) } // every time there is a ''tick'' the current time is printed a = time * 5 //where ''a'' would be a dynamic value always up to date with time

¿Es correcta esta representación de FRP o hay algún problema? Me gusta cómo funciona esto y también lo simple que es describirlo personalmente, pero no estoy seguro de que sea correcto.