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.
źródło
reactive-banana
zdecydowanie opiera się na ciągnięciu, a nie na ciągnięciu.reactive
jest push-pull.Yampa
inetwire
są 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 jakreactive-banana
,sodium
ielerea
korzystać z innych dokładne mechanizmy w celu zapewnienia, że przejście i akumulowanie nie współpracują zbyt dużo.Odpowiedzi:
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
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:
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.
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ść.
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.
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.
źródło