Wie grundlegend unterscheiden sich Push-Pull- und Pfeil-FRP?

264

Ich möchte FRP in Haskell studieren, aber es ist etwas schwierig, sich für eine Bibliothek zu entscheiden. Viele scheinen tote Versuche zu sein, einige scheinen auferstanden zu sein (wie die jüngsten Aktivitäten auf Yampa).

Nach dem, was ich gelesen habe, scheint es zwei "Arten" von FRP zu geben: Push-Pull-FRP (wie bei Reactive-Banana) auf der einen Seite und Pfeil-FRP (wie bei Yampa) auf der anderen Seite. Es scheint, dass es zur Zeit von Fran und FrTime auch einige "klassische FRP" gab, aber ich habe in letzter Zeit keine Aktivitäten in diesen entdeckt.

  • Sind diese zwei (oder drei) wirklich grundlegend unterschiedliche Ansätze von FRP?

  • Ist eine von ihnen veraltete Theorie, während die andere das "Zeug der Zukunft" wäre?

  • Oder müssen sie sich parallel entwickeln und unterschiedliche Zwecke erfüllen?

  • Habe ich die bekannteste Bibliothek jeder Kategorie genannt oder gibt es andere zu berücksichtigende Optionen (Sodium, Netwire, et al.)?


Ich habe mir endlich den Vortrag von Evan Czaplicki angesehen , der in den Kommentaren von J. Abrahamson empfohlen wurde. Es ist sehr interessant und hat mir geholfen, die Dinge zu klären. Ich kann es jedem empfehlen, der diese Frage interessant fand.

Guillaume Ponce
quelle
5
Sie könnten an der Meinung von ertes (dem Netwire-Autor) interessiert sein: stackoverflow.com/a/13344292/414413
Cirdec
14
Wirklich schnell: reactive-bananaist definitiv Pull-basiert, nicht Push-Pull. reactiveist Push-Pull. Yampaund netwiresind pfeilförmig. Es gibt FRPs, die "Akkumulieren von Werten" erlauben, aber kein "Schalten" erlauben, FRPs, die "Schalten" erlauben, aber keine "Akkumulieren von Werten". Beide sind "einfache" FRP. Arrowized FRP ermöglicht das Umschalten und Akkumulieren und verwendet Pfeile, um die Gefahr der Kombination dieser Funktionen zu steuern. Monadic FRP wie reactive-banana, sodiumund elereaverwenden andere Mechanismen vorsichtig , dass Schalten zu gewährleisten und Akkumulieren keine Wechselwirkung zwischen zu viel.
J. Abrahamson
12
Arrowized FRP hat auch die nette Funktion, dass Signale immer im Kontext ihrer Eingänge angegeben werden, wodurch Sie die Ausgänge kovariant und die Eingänge kontravariant transformieren können, um interaktives FRP besser zu simulieren. Ein gutes Beispiel für diese Funktion finden Sie unter Echt funktionale Benutzeroberflächen von Courtney und Elliott.
J. Abrahamson
9
Vielleicht interessiert Sie auch der Vortrag "Controlling Time and Space" des Ulmenautors Evan Czaplicki. Meiner Meinung nach schafft er es, einen guten Überblick über den FRP-Designraum und die damit verbundenen Kompromisse zu geben.
DanielM
3
Ich denke, Sie werden Ihre Antwort hier bekommen .. stackoverflow.com/questions/10000074/…
Rushabh Shah

Antworten:

17

Ich habe eine Reise zu Haskell.org unternommen, um Ihre Frage zu untersuchen. Ich habe zwei wichtige Artikel gefunden, die Sie lesen sollten, um Ihre Forschung voranzutreiben, und ich baue meine Antwort auf Ihre Frage aus diesen wissenschaftlichen Artikeln.

Push-Pull FRP von Conal Elliott

Verallgemeinerung von Monaden auf Pfeile von John Hughes


  1. Ja, aber auch nein. Laut Elliot handelt es sich bei Push um eine datengesteuerte FRP-Bewertung, und Pull bezieht sich auf eine sogenannte "bedarfsgesteuerte" Bewertung. Der Autor empfiehlt Pull, da Push zwischen den Dateneingaben zum Leerlauf neigt. Hier ist der springende Punkt : Push-Pull kombiniert und gleicht diese Verhaltensweisen aus, um die Notwendigkeit der Neuberechnung von Werten zu minimieren. Es ist einfach; Der Betrieb von FRP mit Push-Pull beschleunigt die Reaktionsfähigkeit. Arrow ist eine andere Technik zur Verwendung abstrakter Typen, um Werte zu verknüpfen und gleichzeitig auszuwerten. Alle diese Konzepte unterscheiden sich grundlegend. Aber nimm mein Wort nicht dafür:

    Die Art der Pfeilschnittstelle ist problematisch für das Ziel einer minimalen Neubewertung. Eingabeereignisse und -verhalten werden zu einer einzigen Eingabe zusammengefasst, die sich dann ändert, wenn sich eine Komponente ändert (Elliott).

    Somit widerspricht Arrow dem Ziel des Push-Pull. Das bedeutet nicht, dass Sie nicht alle auf einmal verwenden können, nur dass es komplex wäre, und es gibt einige Dinge, die Sie ohne abstrakte Pfeiltypen nicht berechnen können.

  2. Ich habe keine wissenschaftlichen Meinungen darüber gefunden, welche Ansätze "der Weg der Zukunft" sind. Beachten Sie nur, dass Pfeile besonders gut mit Gleichzeitigkeit umgehen können. Wenn Sie Pfeile implementieren und Push-Pull verwenden könnten, um Berechnungen zu minimieren, wäre dies der Weg der Zukunft.

  3. Ja, sie sprechen unterschiedliche Zwecke an. Wie gesagt, sie können zusammen formuliert werden, aber es ist schwierig zu implementieren, und selbst wenn es funktioniert, würde es wahrscheinlich die reaktiven Geschwindigkeitsvorteile von Push-Pull zunichte machen.

  4. Das ist subjektiv, aber Reactive und Yampa scheinen die am häufigsten zitierten Sprachbibliotheken für FRP zu sein. Ich würde sagen, Reactive von Conal Elliott hat tiefe Wurzeln und Yampa ist ebenfalls etabliert. Andere Projekte wie Netwire entstanden als Ersatz, aber es könnte eine Weile dauern, bis sie die Riesen ersetzen.


Hoffe das hilft! Wie ich bereits sagte, gibt Ihnen das Lesen der Artikel, auf die ich hingewiesen habe, ein besseres Gefühl für die semantische Distanz zwischen Pfeil, Drücken und Ziehen.

Kevin Caravaggio
quelle