Funkční reaktivní programování - Functional reactive programming
![]() | tento článek poskytuje nedostatečný kontext pro ty, kteří danému tématu nejsou obeznámeni.Dubna 2015) (Zjistěte, jak a kdy odstranit tuto zprávu šablony) ( |
Funkční reaktivní programování (FRP) je paradigma programování pro reaktivní programování (asynchronní programování toku dat ) pomocí stavebních bloků Funkcionální programování (např. mapa, snížit, filtr ). Pro programování se používá FRP grafická uživatelská rozhraní (GUI), robotika, hry a hudba, jejichž cílem je zjednodušit tyto problémy explicitním modelováním času.[Citace je zapotřebí ]
Formulace FRP
Původní formulaci funkčního reaktivního programování lze najít v dokumentu ICFP 97 Functional Reactive Animation od Conal Elliott a Paul Hudak.[1]
FRP má od svého zavedení v roce 1997 mnoho podob. Jedna osa rozmanitosti je diskrétní vs. spojitá sémantika. Další osou je, jak lze dynamicky měnit systémy FRP.[2]
Kontinuální
Nejstarší formulace FRP používala kontinuální sémantiku, jejímž cílem bylo abstrahovat od mnoha provozních detailů, které nejsou důležité pro význam programu.[3] Klíčové vlastnosti této formulace jsou:
- Hodnoty modelování, které se v průběhu času mění, nazývají se „chování“ a později „signály“.
- Modelování "Události "které se vyskytly v jednotlivých časových bodech.
- Systém lze změnit v reakci na události, obecně nazývaný „přepínání“.
- Oddělení podrobností vyhodnocení, jako je vzorkovací frekvence, od reaktivního modelu.
Tento sémantický model FRP v vedlejší účinek volné jazyky jsou obvykle z hlediska nepřetržitých funkcí a obvykle v průběhu času.[4]
Oddělený
Formulace jako Event-Driven FRP a verze Jilm před 0,17 vyžadují, aby aktualizace byly diskrétní a řízené událostmi.[5] Tyto formulace prosadily praktické FRP se zaměřením na sémantiku, která má jednoduché API, které lze efektivně implementovat v prostředí, jako je robotika nebo ve webovém prohlížeči.[6]
V těchto formulacích je běžné, že myšlenky chování a událostí jsou kombinovány do signálů, které mají vždy aktuální hodnotu, ale mění se diskrétně.[7]
Interaktivní FRP
Bylo zdůrazněno, že běžný model FRP, od vstupů po výstupy, se špatně hodí k interaktivním programům.[8] Chybějící schopnost „spouštět“ programy v rámci mapování ze vstupů na výstupy může znamenat, že je třeba použít jedno z následujících řešení:
- Vytvořte datovou strukturu akcí, které se zobrazí jako výstupy. Akce musí být prováděny externím tlumočníkem nebo prostředím. To zdědilo všechny potíže původního I / O systému proudu Haskell.[9]
- Použijte šipkové FRP a vložte šipky, které jsou schopné provádět akce. Akce mohou mít také identity, což jim umožňuje udržovat například oddělené proměnlivé úložiště. Toto je přístup, který zaujala knihovna Fudgets[10] a obecněji funkce Monadic Stream.[11]
- Novým přístupem je umožnit spuštění akcí nyní (v monostartu IO), ale odložit příjem jejich výsledků na později.[12] To využívá interakci mezi Event a IO monadami a je kompatibilní s více výrazově orientovaným FRP:
planNow :: Událost (IO a) -> IO (Událost a)
Problémy s implementací
Existují dva typy systémů FRP, push-based a pull-based. Push-based systémy přijímají události a prosazují je přes signální síť, aby dosáhly výsledku. Systémy založené na tahu čekají, až bude požadován výsledek, a pracují zpětně v síti, aby načetly požadovanou hodnotu.
Některé systémy FRP, jako je Yampa, používají vzorkování, kde jsou vzorky odebírány signální sítí. Tento přístup má nevýhodu: síť musí čekat až na dobu trvání jednoho výpočetního kroku, aby zjistila změny na vstupu. Příkladem FRP založeného na vyžádání je vzorkování.
Knihovny Reactive a Etage zapnuty Hackování představil přístup zvaný push-pull FRP. V tomto přístupu, pouze když je požadována další událost na čistě definovaném streamu (například seznam pevných událostí s časy), je tato událost vytvořena. Tyto čistě definované proudy fungují jako líné seznamy v Haskellu. To je tahová polovina. Poloviční část se používá, když se přivedou události mimo systém. Externí události se předají spotřebitelům, aby mohli o události zjistit okamžitě, jakmile je vydána.
Implementace
- Yampa je šípový, efektivní, čistý Haskell implementace s podporou SDL, SDL2, OpenGL a HTML DOM.
- Programovací jazyk Jilm slouží k podpoře FRP [13] ale od té doby jej nahradil jiným vzorem [14]
- reflex je efektivní implementace FRP push / pull v Haskellu s hostiteli pro prohlížeč /DOM, SDL a lesk.
- reaktivní banán je implementace cílového agnostického push FRP v Haskellu.
- síť a různé jsou šipkami, vytáhněte implementace FRP v Haskellu.
- Flapjax je implementace FRP chování / události v JavaScript.
- Reagovat je OCaml modul pro funkční reaktivní programování.
- Sodík je implementace FRP nabízená nezávisle na konkrétním rámci uživatelského rozhraní pro několik programovacích jazyků, jako je Java, TypeScript a C #.
- ReactiveX, popularizovaný jeho JavaScript implementace rxjs, je komplexní multiplatformní paradigma pro implementaci funkčního reaktivního programování zpracováním dat jako proudů pozorovatelných.
- Dunai je rychlá implementace v Haskellu pomocí Funkce monadického proudu , který podporuje FRP Classic a Arrowized.
Viz také
Reference
- ^ Elliott, Conal; Hudak, Paul. "Funkční reaktivní animace". Funkční reaktivní animace. ICFP ’97. Citováno 14. července 2018.
- ^ Nilsson, Henrik; Courtney, Antony; Peterson, John (únor 2011) [2002], „Funkční reaktivní programování, pokračování“, Workshop Haskell (PDF).
- ^ Elliott, Conal; Hudak, Paul (1997), "Funkční reaktivní animace", ICFP.
- ^ Courtney, Antony; Elliott, Conal (únor 2011) [2001], „Skutečně funkční uživatelská rozhraní“ (PDF), Workshop Haskell, Yale.
- ^ Taha, Walid; Wan, Zhanyong; Hudak, Paul (2002), „Event-Driven FRP“, PADL (PDF), Yale, archivovány z originál (PDF) dne 2013-09-28, vyvoláno 2013-09-23.
- ^ Czaplicki, Evan; Chong, Stephen (2013), „Asynchronous Functional Reactive Programming for GUIs“, PLDI, Harvard.
- ^ Wan, Zhanyong; Taha, Walid; Hudak, Paul (únor 2011), „FRP v reálném čase“, ICFP (PDF), archivovány z originál (PDF) dne 2013-09-28, vyvoláno 2013-09-23.
- ^ 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/
- ^ Perez, Ivan; Barenz, Manuel; Nilsson, Henrik (červenec 2016), „Functional Reactive Programming, Refactored“, Haskell Symposium (PDF).
- ^ „Archivovaná kopie“ (PDF). Archivovány od originál (PDF) dne 01.07.2015. Citováno 2015-07-24.CS1 maint: archivovaná kopie jako titul (odkaz)
- ^ Czaplicki, Evan (duben 2012), Elm: Souběžný FRP pro funkční GUI (PDF) (práce), Harvard, archivovány od originál (PDF ) dne 2016-06-04, vyvoláno 2015-02-17.
- ^ Czaplicki, Evan. „Sbohem FRP“. jilm. Citováno 14. července 2018.
externí odkazy
- cellx - ultrarychlá implementace reaktivity pro JavaScript
- Výzkum FRP související s Haskellem
- "Ukončení podpory vzoru pozorovatele pomocí Scala.React, "- Scala.React, implementace FRP Scala
- Co je (funkční) reaktivní programování? - Odpovědi na přetečení zásobníku
- Funkční reaktivní programování: Návrh funkčního programu ve Scale - Přednáška od École Polytechnique Fédérale de Lausanne je Coursera kurz na téma "Návrh funkčních programů v České republice" Scala ", od Martin Oderský