Quanto sono fondamentalmente diversi i FRP push-pull e arrowized?


265

Voglio studiare FRP in Haskell, ma è un po 'difficile decidere su una libreria da usare. Molti sembrano essere tentativi morti, alcuni sembrano essere stati resuscitati (come la recente attività su Yampa).

Da quello che ho letto, sembra che ci siano due "tipi" di FRP: push-pull FRP (come in Reactive-banana) su un lato e FRP arrowized (come su Yampa) sull'altro lato. Sembra che ci fossero anche dei "classici FRP" ai tempi di Fran e FrTime, ma non ho notato alcuna attività recente in questi.

  • Questi due (o tre) approcci alla FRP sono fondamentalmente diversi?

  • Una di queste è una teoria obsoleta, mentre l'altra sarebbe la "roba del futuro"?

  • O devono evolversi in parallelo, affrontando scopi diversi?

  • Ho chiamato la libreria più importante di ogni categoria o ci sono altre opzioni da considerare (Sodio, Netwire, et al)?


Alla fine ho visto il discorso di Evan Czaplicki raccomandato nei commenti di J. Abrahamson. È molto interessante e mi ha aiutato a chiarire le cose. Lo consiglio vivamente a chiunque abbia trovato interessante questa domanda.


5
Si potrebbe essere interessati a ertes' parere (l'autore NetWire): stackoverflow.com/a/13344292/414413
Cirdec

14
Davvero in fretta: reactive-bananaè sicuramente basato su pull non push-pull. reactiveè push-pull. Yampae netwiresono arrowized. Esistono FRP che consentono "l'accumulo di valori" ma non consentono la "commutazione", FRP che consentono la "commutazione" ma non "l'accumulazione di valori". Entrambi sono FRP "semplici". FRP Arrowized consente il passaggio e l'accumulo e utilizza le frecce per controllare il pericolo di combinare tali funzionalità. FRP Monadic come reactive-banana, sodiume elereautilizzare altri meccanismi attenti a garantire che la commutazione e di accumulazione non interagiscono troppo.
J. Abrahamson,

12
Il FRP Arrowized ha anche la caratteristica ordinata che i segnali sono sempre dichiarati nel contesto dei loro input, il che consente di trasformare gli output in modo covariante e gli input in modo contraddittorio al fine di simulare meglio il FRP interattivo. Vedi Interfacce utente veramente funzionali di Courtney ed Elliott per un ottimo esempio di quella funzionalità.
J. Abrahamson,

9
Potresti anche essere interessato al discorso "Controllo del tempo e dello spazio" dell'autore di Elm Evan Czaplicki. A mio avviso, riesce a fornire una buona panoramica di alto livello sullo spazio di progettazione FRP e sui compromessi coinvolti.
DanielM,

3
Credo che si otterrà la risposta qui .. stackoverflow.com/questions/10000074/...
Rushabh Shah

Risposte:


18

Ho fatto un viaggio su Haskell.org per indagare sulla tua domanda. Ciò che ho trovato sono due importanti documenti che dovresti leggere per approfondire la tua ricerca, e sto costruendo la mia risposta alla tua domanda da questi studi accademici.

Push-Pull FRP di Conal Elliott

Generalizzare le Monadi in Frecce di John Hughes


  1. Sì, ma anche no. Secondo Elliot, push è una valutazione basata sui dati basata su FRP e pull riguarda quella che viene definita valutazione basata sulla "domanda". L'autore consiglia pull perché push tende a rimanere inattivo tra gli input di dati. Ecco il punto cruciale: push-pull combina e bilancia questi comportamenti allo scopo principale di ridurre al minimo la necessità di ricalcolare i valori. È semplice; il funzionamento del FRP con push-pull accelera la capacità di reagire. La freccia è una tecnica diversa per l'utilizzo di tipi astratti per collegare valori e valutarli contemporaneamente. Tutti questi concetti sono fondamentalmente diversi. Ma non crederci sulla parola:

    La natura dell'interfaccia Arrow è problematica per l'obiettivo di una rivalutazione minima. Gli eventi e i comportamenti di input vengono combinati in un singolo input, che cambia ogni volta che cambia un componente (Elliott).

    Pertanto, Arrow contraddice l'obiettivo di push-pull. Ciò non significa che non puoi usarli tutti in una volta, solo che sarebbe complesso e ci sono alcune cose che non puoi calcolare senza i tipi di freccia astratti.

  2. Non ho trovato opinioni accademiche su quali approcci siano "la via del futuro". Nota solo che le frecce sono in grado di gestire la simultaneità particolarmente bene. Se potessi implementare le frecce e utilizzare il push-pull per ridurre al minimo i calcoli, sarebbe la strada per il futuro.

  3. Sì, si rivolgono a scopi separati. Come ho detto, possono essere formulati insieme ma è difficile da implementare e anche se funziona, probabilmente annullerebbe i vantaggi della velocità reattiva del push-pull.

  4. È soggettivo, ma Reactive e Yampa sembrano essere le librerie di lingue più comunemente citate per FRP. Direi che Reactive di Conal Elliott ha radici profonde e anche Yampa è affermata. Altri progetti come Netwire nacquero come rimpiazzi, ma potrebbe passare un po 'di tempo prima che sostituiscano i giganti.


Spero che questo ti aiuti! Come ho detto, leggere gli articoli che ho sottolineato ti darà un migliore senso della distanza semantica tra freccia, spingere e tirare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.