Articulo de referencia

Programación reactiva funcional

La programación reactiva funcional ( FRP ) es un paradigma de programación para la programación reactiva ( programación de flujo de datos asincrónico ) que utiliza los component...

La programación reactiva funcional ( FRP ) es un paradigma de programación para la programación reactiva ( programación de flujo de datos asincrónico ) que utiliza los componentes básicos de la programación funcional (por ejemplo, map , reduce , filter ). La 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 mediante el modelado explícito del tiempo. [ cita requerida ]

Formulaciones de FRP

La formulación original de la programación reactiva funcional se puede encontrar en el artículo ICFP 97 Functional Reactive Animation de Conal Elliott y Paul Hudak . [1]

Desde su introducción en 1997, el FRP ha adoptado muchas formas. Un eje de diversidad es la semántica discreta frente a la semántica continua. Otro eje es cómo se pueden modificar dinámicamente los sistemas FRP. [2]

Continuo

La primera formulación 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:

  • Modelado de 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 modificar en respuesta a eventos, generalmente denominado "conmutación".
  • La separación de los detalles de evaluación, como la frecuencia de muestreo, del modelo reactivo.

Este modelo semántico de FRP en lenguajes libres de efectos secundarios se presenta típicamente en términos de funciones continuas y, por lo general, a lo largo del tiempo. [4] Esta formulación también se conoce como programación denotativa de tiempo continuo (DCTP). [5]

Discreto

Las formulaciones como Event-Driven FRP y las versiones de Elm anteriores a la 0.17 requieren que las actualizaciones sean discretas y controladas por eventos. [6] Estas formulaciones han impulsado un 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. [7]

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 cambian discretamente. [8]

FRP interactivo

Se ha señalado que el modelo FRP ordinario, de entradas a salidas, no es adecuado para programas interactivos. [9] La falta de capacidad para "ejecutar" programas dentro de un mapeo de entradas a salidas puede significar que se debe utilizar una de las siguientes soluciones:

  • Crea una estructura de datos de acciones que aparecen como salidas. Las acciones deben ser ejecutadas por un intérprete o entorno externo. Esto hereda todas las dificultades del sistema de entrada/salida (E/S) de flujo original de Haskell . [10]
  • Utilice FRP con flechas e incorpore flechas capaces de realizar acciones. Las acciones también pueden tener identidades, lo que les permite mantener almacenes mutables separados, por ejemplo. Este es el enfoque adoptado por la biblioteca Fudgets [11] y, de manera más general, por las funciones de flujo monádicas [12] .
  • El nuevo enfoque consiste en permitir que las acciones se ejecuten ahora (en la mónada IO) pero posponer la recepción de sus resultados hasta más tarde. [13] Esto hace uso de una interacción entre las mónadas Event y 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

Existen dos tipos de sistemas FRP: los basados ​​en push y los basados ​​en pull. Los sistemas basados ​​en push toman eventos y los envían a través de una red de señales para lograr un resultado. Los sistemas basados ​​en pull esperan hasta que se solicita el resultado y funcionan en sentido inverso a través de la red para recuperar el valor solicitado.

Algunos sistemas FRP como Yampa utilizan el muestreo, en el que las muestras son extraídas por la red de señales. Este enfoque tiene un inconveniente: la red debe esperar hasta que transcurra 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 de Hackage introdujeron un enfoque denominado FRP push-pull. En él, solo cuando se solicita el próximo evento en un flujo definido de forma pura (como una lista de eventos fijos con tiempos), se construye ese evento. Estos flujos definidos de forma pura actúan como listas perezosas en Haskell . Esa es la mitad basada en pull. La mitad basada en push se utiliza cuando se incorporan eventos externos al sistema. Los eventos externos se envían a los consumidores, de modo que puedan enterarse de un evento en el instante en que se emite.

Implementaciones

Existen implementaciones para muchos lenguajes de programación , incluidos:

  • Yampa es una implementación de Haskell pura, eficiente y con flechas , con soporte para SDL, SDL2, OpenGL y HTML DOM.
  • El lenguaje Elm solía soportar FRP [14] pero desde entonces lo ha reemplazado con un patrón diferente. [15]
  • reflex es una implementación eficiente de FRP push-pull en Haskell con hosts para navegador web : Document Object Model (DOM), Simple DirectMedia Layer (SDL) y Gloss.
  • reactive-banana es una implementación de FRP push independiente del objetivo en Haskell.
  • netwire y varying están flechados, extraen 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 (UI) específico para varios lenguajes, como Java , TypeScript y C# .
  • Dunai es una implementación rápida en Haskell que utiliza funciones de flujo monádico que admiten FRP clásico y arrowizado.
  • ObservableComputations, una implementación .NET multiplataforma .
  • Stella es un lenguaje reactivo basado en un modelo de actores que demuestra un modelo de "actores" y "reactores" que tiene como objetivo evitar los problemas de combinar código imperativo con código reactivo (separándolos en actores y reactores). [16] Los actores son adecuados para su uso en sistemas reactivos distribuidos. [17]
  • TidalCycles es un lenguaje específico del dominio FRP puro para patrones musicales, integrado en el lenguaje Haskell .

ReactiveX , popularizado por su implementación de JavaScript rxjs, es funcional y reactivo pero se diferencia de la programación reactiva funcional. [18]

Véase también

Referencias

  1. ^ Elliott, Conal; Hudak, Paul. "Functional Reactive Animation". Animación reactiva funcional . ICFP '97 . Consultado el 14 de julio de 2018 .
  2. ^ Nilsson, Henrik; Courtney, Antony; Peterson, John (febrero de 2011) [2002], "Programación reactiva funcional, continuación", Taller de Haskell (PDF)
  3. ^ Elliott, Conal; Hudak, Paul (1997), "Animación reactiva funcional", ICFP
  4. ^ Courtney, Antony; Elliott, Conal (febrero de 2011) [2001], "Interfaces de usuario genuinamente funcionales", Haskell Workshop , Yale
  5. ^ Elliot, Conal (2014), "Denotational Design" (PDF) , LambdaJam , consultado el 5 de mayo de 2023
  6. ^ 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
  7. ^ Czaplicki, Evan; Chong, Stephen (2013), "Programación reactiva funcional asincrónica para GUI", PLDI , Harvard
  8. ^ 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
  9. ^ Elliott, Conal (9 de diciembre de 2008). "Por qué el FRP clásico no se adapta al comportamiento interactivo". Archivado desde el original el 12 de octubre de 2022.
  10. ^ Borning, Alan. "E/S en lenguajes puramente funcionales" (PDF) . Archivado (PDF) desde el original el 28 de abril de 2022.
  11. ^ Carlsson, Magnus; Hallgren, Thomas (1998). "Fudgets: procesos puramente funcionales con aplicaciones en interfaces gráficas de usuario" (PDF) . Archivado (PDF) desde el original el 15 de octubre de 2022.
  12. ^ Pérez, Iván; Barenz, Manuel; Nilsson, Henrik (julio de 2016), "Programación reactiva funcional, refactorizada", Simposio Haskell (PDF)
  13. ^ Atze van der Ploeg; Claessen, Koen. "FRP basado en principios prácticos" (PDF) . Archivado desde el original (PDF) el 2015-07-01 . Consultado el 2015-07-24 .
  14. ^ 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{{citation}}: Mantenimiento de CS1: falta la ubicación del editor ( enlace )
  15. ^ Czaplicki, Evan. "A Farewell to FRP". elm . Consultado el 14 de julio de 2018 .
  16. ^ Van den Vonder, Sam; Renaux, Thierry; Oeyen, Bjarno; De Koster, Joeri; De Meuter, Wolfgang (2020), "Abordar el escuadrón incómodo para la programación reactiva: el modelo actor-reactor", Leibniz International Proceedings in Informatics (LIPIcs), vol. 166, págs. 19:1–19:29, doi : 10.4230/LIPIcs.ECOOP.2020.19 , ISBN 9783959771542, Número de identificación del sujeto  260445152
  17. ^ Van den Vonder, Sam; Renaux, Thierry; De Meuter, Wolfgang (2022), "Reactividad a nivel de topología en programas reactivos distribuidos: gestión de conocimiento reactivo mediante bandadas", El arte, la ciencia y la ingeniería de la programación, vol. 6, págs. 14:1–14:36, arXiv : 2202.09228 , doi : 10.22152/programming-journal.org/2022/6/14 , S2CID  246979565
  18. ^ "ReactiveX". ReactiveX.io . Consultado el 3 de julio de 2022 .
Obtenido de "https://es.wikipedia.org/w/index.php?title=Programación_reactiva_funcional&oldid=1237280557"