Możesz zaimplementować ograniczoną formę FRP przy użyciu procesorów strumieniowych. Na przykład, przy użyciu biblioteki pipes
, można zdefiniować źródło zdarzeń:
mouseCoordinates :: (Proxy p) =>() -> Producer p MouseCoord IO r
... i można podobnie zdefiniować graficzną obsługi, która pobiera i aktualizuje współrzędne myszy kursor na płótnie:
coordHandler :: (Proxy p) =>() -> Consumer p MouseCoord IO r
Następnie należy podłączyć zdarzeń myszy do obsługi za pomocą składzie:
>>> runProxy $ mouseCoordinates >-> coordHandler
I będzie działać tak, jak można się spodziewać.
Tak jak powiedziałeś, działa to dobrze dla pojedynczego łańcucha etapów, ale co z bardziej arbitralnymi topologiami? Okazuje się, że skoro centralny pipes
jest monadowym transformatorem, można modelować dowolną topologię, po prostu zagnieżdżając transformatory monad proxy na sobie. Na przykład, oto, w jaki sposób można zamieniać dwa strumienie wejściowe:
zipD
:: (Monad m, Proxy p1, Proxy p2, Proxy p3)
=>() -> Consumer p1 a (Consumer p2 b (Producer p3 (a, b) m)) r
zipD() = runIdentityP $ hoist (runIdentityP . hoist runIdentityP) $ forever $ do
a <- request() -- Request from the outer Consumer
b <- lift $ request() -- Request from the inner consumer
lift $ lift $ respond (a, b) -- Respond to the Producer
Zachowuje się jak funkcja curry. Częściowo stosuje się go do każdego wejścia sekwencyjnie, a następnie można go uruchomić po pełnym zastosowaniu.
-- 1st application
p1 = runProxyK $ zipD <-< fromListS [1..]
-- 2nd application
p2 = runProxyK $ p2 <-< fromListS [4..6]
-- 3rd application
p3 = runProxy $ printD <-< p3
To działa dokładnie tak, jak można się spodziewać:
>>> p3
(1, 4)
(2, 5)
(3, 6)
Ta sztuczka uogólnia do dowolnej topologii.Więcej informacji na ten temat można znaleźć w sekcji Control.Proxy.Tutorial w sekcji "Oddziały, zamki i scalenia". W szczególności powinieneś sprawdzić kombinator fork
, którego używa jako przykładu, który pozwala podzielić strumień na dwa wyjścia.
Ah, miałem zamiar opublikować coś podobnego, ale odłożę się na wiedzę kogoś, kto faktycznie napisał bibliotekę AFRP. :] –
Wygląda na to, że użycie (A) FRP nie ogranicza się do struktury wykresu acyklicznego, czy to prawda? – fho
Nie jest dla mnie jasne z twojej odpowiedzi, czy jakikolwiek aspekt AFRP nie może być zaimplementowany w terminach lub w ostatnim strumieniu posiadającym biblioteki kanałów/rur? – Davorak