La programación reactiva funcional ( FRP ) es un paradigma de programación para la programación reactiva ( programación de flujo de datos asíncrono ) que utiliza los componentes básicos de la programación funcional (por ejemplo , mapear , reducir , filtrar ). El FRP se ha utilizado para programar interfaces gráficas de usuario (GUI), robótica , juegos y música, con el objetivo de simplificar estos problemas modelando explícitamente el tiempo. [ cita requerida ]
Formulaciones de FRP
La formulación original de la programación reactiva funcional se puede encontrar en el artículo de ICFP 97 Functional Reactive Animation de Conal Elliott y Paul Hudak . [1]
FRP ha adoptado muchas formas desde su introducción en 1997. Un eje de diversidad es la semántica discreta frente a la continua. Otro eje es cómo se pueden cambiar dinámicamente los sistemas de FRP. [2]
Continuo
La formulación más temprana de FRP utilizó semántica continua, con el objetivo de abstraer muchos detalles operativos que no son importantes para el significado de un programa. [3] Las propiedades clave de esta formulación son:
- Modelar valores que varían a lo largo del tiempo continuo, llamados "comportamientos" y más tarde "señales".
- Modelado de " eventos " que ocurren en puntos discretos en el tiempo.
- El sistema se puede cambiar en respuesta a eventos, generalmente denominados "conmutación".
- La separación de los detalles de la evaluación, como la frecuencia de muestreo, del modelo reactivo.
Este modelo semántico de FRP en lenguajes libres de efectos secundarios es típicamente en términos de funciones continuas y típicamente a lo largo del tiempo. [4]
Discreto
Las formulaciones como el FRP impulsado por eventos y las versiones de Elm anteriores a la 0.17 requieren que las actualizaciones sean discretas y controladas por eventos. [5] Estas formulaciones han impulsado el FRP práctico, centrándose en la semántica que tiene una API simple que se puede implementar de manera eficiente en un entorno como la robótica o en un navegador web. [6]
En estas formulaciones, es común que las ideas de comportamientos y eventos se combinen en señales que siempre tienen un valor actual, pero que cambian discretamente. [7]
FRP interactivo
Se ha señalado que el modelo FRP ordinario, desde las entradas hasta las salidas, no se adapta bien a los programas interactivos. [8] La falta de la capacidad de "ejecutar" programas dentro de un mapeo de entradas a salidas puede significar que se deba utilizar una de las siguientes soluciones:
- Cree una estructura de datos de acciones que aparecen como salidas. Las acciones deben ser ejecutadas por un intérprete externo o un entorno. Esto hereda todas las dificultades del sistema de E / S de flujo original de Haskell. [9]
- Utilice FRP con flechas e incruste flechas que sean capaces de realizar acciones. Las acciones también pueden tener identidades, lo que les permite mantener tiendas mutables separadas, por ejemplo. Este es el enfoque adoptado por la biblioteca Fudgets [10] y, más generalmente, Monadic Stream Functions. [11]
- El enfoque novedoso es permitir que las acciones se ejecuten ahora (en la mónada IO) pero posponer la recepción de sus resultados para más adelante. [12] Esto hace uso de una interacción entre el Evento y las mónadas IO, y es compatible con un FRP más orientado a la expresión:
planNow :: Evento (IO a) -> IO (Evento a)
Problemas de implementación
Hay dos tipos de sistemas FRP, basados en push y basados en pull. Los sistemas basados en empuje toman eventos y los empujan a través de una red de señales para lograr un resultado. Los sistemas basados en extracción esperan hasta que se demanda el resultado y trabajan hacia atrás a través de la red para recuperar el valor demandado.
Algunos sistemas de FRP como Yampa usan muestreo, donde las muestras son extraídas por la red de señales. Este enfoque tiene un inconveniente: la red tiene que esperar hasta la duración de un paso de cálculo para conocer los cambios en la entrada. El muestreo es un ejemplo de FRP basado en extracción.
Las bibliotecas Reactive y Etage en Hackage introdujeron un enfoque llamado FRP push-pull. En este enfoque, solo cuando se demanda el siguiente evento en una secuencia puramente definida (como una lista de eventos fijos con tiempos), se construye ese evento. Estos flujos puramente definidos actúan como listas perezosas en Haskell. Esa es la mitad basada en pull. La mitad basada en push se utiliza cuando se introducen eventos externos al sistema. Los eventos externos se envían a los consumidores para que puedan conocer un evento en el instante en que se emite.
Implementaciones
- Yampa es una implementación Haskell pura, eficiente y con flechas con soporte SDL, SDL2, OpenGL y HTML DOM.
- El lenguaje de programación que usaba Elm para soportar FRP [13] pero desde entonces lo ha reemplazado con un patrón diferente [14]
- reflex es una implementación eficiente de FRP push / pull en Haskell con hosts para navegador / DOM , SDL y Gloss.
- reactive-banana es una implementación de FRP de empuje agnóstico objetivo en Haskell.
- netwire y las variantes están flechadas, tirar de las implementaciones de FRP en Haskell.
- Flapjax es una implementación de FRP de comportamiento / evento en JavaScript .
- React es un módulo OCaml para programación reactiva funcional.
- Sodium es una implementación de FRP push independiente de un marco de interfaz de usuario específico para varios lenguajes de programación, como Java, TypeScript y C #.
- ReactiveX , popularizado por su implementación de JavaScript rxjs , es un paradigma multiplataforma integral para implementar la programación reactiva funcional al tratar los datos como flujos de observables.
- Dunai es una implementación rápida en Haskell que usa Monadic Stream Functions que admite FRP Classic y Arrowized.
- ObservableComputations , una implementación de .NET multiplataforma.
Ver también
- Computación incremental
- Procesamiento de flujo
Referencias
- ^ Elliott, Conal; Hudak, Paul. "Animación reactiva funcional" . Animación reactiva funcional . ICFP '97 . Consultado el 14 de julio de 2018 .
- ^ Nilsson, Henrik; Courtney, Antony; Peterson, John (febrero de 2011) [2002], "Programación reactiva funcional, continuación", Taller de Haskell (PDF).
- ^ Elliott, Conal; Hudak, Paul (1997), "Animación reactiva funcional" , ICFP.
- ^ Courtney, Antony; Elliott, Conal (febrero de 2011) [2001], "Interfaces de usuario genuinamente funcionales" (PDF) , Haskell Workshop , Yale.
- ^ Taha, Walid; Wan, Zhanyong; Hudak, Paul (2002), "Event-Driven FRP", PADL (PDF) , Yale, archivado desde el original (PDF) el 28 de septiembre de 2013 , consultado el 23 de septiembre de 2013.
- ^ Czaplicki, Evan; Chong, Stephen (2013), "Programación reactiva funcional asincrónica para GUI" , PLDI , Harvard.
- ^ Wan, Zhanyong; Taha, Walid; Hudak, Paul (febrero de 2011), "Real-Time FRP", ICFP (PDF) , archivado desde el original (PDF) el 28 de septiembre de 2013 , consultado el 23 de septiembre de 2013.
- ^ http://conal.net/blog/posts/why-classic-frp-does-not-fit-interactive-behavior
- ^ https://courses.cs.washington.edu/courses/cse505/01au/functional/functional-io.pdf
- ^ http://www.cse.chalmers.se/~hallgren/Thesis/
- ^ Pérez, Iván; Barenz, Manuel; Nilsson, Henrik (julio de 2016), "Programación reactiva funcional, refactorizada", Simposio de Haskell (PDF).
- ^ "Copia archivada" (PDF) . Archivado desde el original (PDF) el 1 de julio de 2015 . Consultado el 24 de julio de 2015 .CS1 maint: copia archivada como título ( enlace )
- ^ Czaplicki, Evan (abril de 2012), Elm: FRP concurrente para GUI funcionales (PDF) (tesis), Harvard, archivado desde el original ( PDF ) el 4 de junio de 2016 , consultado el 17 de febrero de 2015.
- ^ Czaplicki, Evan. "Adiós a FRP" . olmo . Consultado el 14 de julio de 2018 .
enlaces externos
- cellx : una implementación ultrarrápida de reactividad para JavaScript
- Investigación de FRP relacionada con Haskell
- " Desactivación del patrón Observer con Scala.React ", Scala.React, una implementación de FRP Scala
- ¿Qué es la programación reactiva (funcional)? - Respuestas de Stack Overflow
- Programación funcional reactiva: Diseño del programa funcional en Scala - Una conferencia de la École Polytechnique Fédérale de Lausanne 's Coursera curso de 'Diseño del programa funcional en Scala ', por Martin Odersky