Jak zasadniczo różne są FRP typu „push-pull” i „strzałkowane”?


264

Chcę uczyć się FRP w Haskell, ale wybór biblioteki jest nieco trudny. Wiele z nich wydaje się nieudanymi próbami, niektóre zostały wskrzeszone (np. Niedawna aktywność na Yampie).

Z tego, co przeczytałem, wydaje się, że istnieją dwa „rodzaje” FRP: push-pull FRP (jak w Reactive-banana) z jednej strony i FRP (jak w Yampa) z drugiej strony. Wygląda na to, że w czasach Fran i FrTime istniało również „klasyczne FRP”, ale nie zauważyłem w nich żadnej niedawnej aktywności.

  • Czy te dwa (lub trzy) naprawdę zasadniczo różnią się podejścia do FRP?

  • Czy jedna z nich jest przestarzałą teorią, podczas gdy druga byłaby „rzeczą przyszłości”?

  • Czy też muszą ewoluować równolegle, realizując różne cele?

  • Czy wymieniłem najważniejszą bibliotekę w każdej kategorii, czy też są inne opcje do rozważenia (Sodium, Netwire i in.)?


W końcu obserwowałem przemówienie Evana Czaplickiego zalecane w komentarzach J. Abrahamsona. Jest to bardzo interesujące i pomogło mi to wyjaśnić. Gorąco polecam każdemu, kto uznał to pytanie za interesujące.


5
Być może zainteresuje Cię opinia ertesa (autora sieci): stackoverflow.com/a/13344292/414413
Cirdec

14
Naprawdę szybko: reactive-bananazdecydowanie opiera się na ciągnięciu, a nie na ciągnięciu. reactivejest push-pull. Yampai netwiresą zaznaczone strzałkami. Istnieją FRP, które pozwalają na „gromadzenie wartości”, ale nie pozwalają na „przełączanie”, FRP, które umożliwiają „przełączanie”, ale nie „gromadzenie wartości”. Oba są „prostymi” FRP. Arrowized FRP umożliwia przełączanie i akumulowanie oraz wykorzystuje strzałki do kontrolowania niebezpieczeństwa połączenia tych funkcji. Monadycznego FRP jak reactive-banana, sodiumi elereakorzystać z innych dokładne mechanizmy w celu zapewnienia, że przejście i akumulowanie nie współpracują zbyt dużo.
J. Abrahamson

12
Strzałkowane FRP ma również ciekawą cechę polegającą na tym, że sygnały są zawsze podawane w kontekście ich sygnałów wejściowych, co pozwala przekształcać wyjścia kowariantne i wejściowe przeciwnie, aby lepiej symulować interaktywne FRP. Zobacz autentycznie funkcjonalne interfejsy użytkownika autorstwa Courtney i Elliott, aby uzyskać doskonały przykład tej funkcji.
J. Abrahamson

9
Być może zainteresuje Cię także przemówienie Elm autora Evana Czaplickiego „Kontrolowanie czasu i przestrzeni” . Moim zdaniem udało mu się uzyskać dobry ogólny przegląd przestrzeni projektowej FRP i związanych z nią kompromisów.
DanielM

3
Myślę, że dostaniesz tutaj swoją odpowiedź .. stackoverflow.com/questions/10000074/…
Rushabh Shah

Odpowiedzi:


17

Pojechałem na Haskell.org, aby zbadać twoje pytanie. Znalazłem dwa ważne artykuły, które powinieneś przeczytać, aby kontynuować badania, i buduję odpowiedź na twoje pytanie z tych artykułów naukowych.

Push-Pull FRP firmy Conal Elliott

Uogólnianie Monad na strzały Johna Hughesa


  1. Tak, ale też nie. Według Elliota push jest oceną FRP opartą na danych, a pull odnosi się do tak zwanej oceny opartej na „popycie”. Autor zaleca pull, ponieważ push ma tendencję do bezczynności między danymi wejściowymi. Oto sedno: push-pull łączy i równoważy te zachowania, głównie w celu zminimalizowania potrzeby ponownego obliczania wartości. To proste; obsługa FRP z push-pullem przyspiesza zdolność do reagowania. Strzałka to inna technika wykorzystywania typów abstrakcyjnych do łączenia wartości i oceny ich jednocześnie. Wszystkie te koncepcje są zasadniczo różne. Ale nie wierz mi na słowo:

    Charakter interfejsu Arrow jest problematyczny z punktu widzenia minimalnej ponownej oceny. Zdarzenia wejściowe i zachowania są łączone w jedno wejście, które następnie zmienia się za każdym razem, gdy zmienia się jakikolwiek element (Elliott).

    Zatem Arrow jest sprzeczny z celem push-pull. Nie oznacza to, że nie możesz używać ich wszystkich naraz, tylko że byłoby to skomplikowane, a jest kilka rzeczy, których nie możesz obliczyć bez abstrakcyjnych typów Strzałek.

  2. Nie znalazłem naukowych opinii na temat tego, które podejścia są „drogą przyszłości”. Pamiętaj tylko, że strzały szczególnie dobrze radzą sobie z jednoczesnością. Gdybyś mógł zaimplementować strzałki i użyć push-pull, aby zminimalizować obliczenia, byłby to sposób na przyszłość.

  3. Tak, dotyczą one odrębnych celów. Jak powiedziałem, można je formułować razem, ale jest to trudne do wdrożenia, a nawet jeśli to zadziała, prawdopodobnie zlekceważy to korzyści wynikające z prędkości biernej wynikające z push-pull.

  4. To subiektywne, ale Reactive i Yampa wydają się być najczęściej cytowanymi bibliotekami językowymi dla FRP. Powiedziałbym, że Reactive Conal Elliott ma głębokie korzenie, a Yampa również ma siedzibę. Inne projekty, takie jak Netwire, powstały jako zamienniki, ale może minąć trochę czasu, zanim zastąpią gigantów.


Mam nadzieję że to pomoże! Tak jak powiedziałem, czytanie artykułów, które wskazałem, pozwoli lepiej zrozumieć semantyczną odległość między strzałką, pchaniem i ciągnięciem.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.