Dans quelle mesure les FRP push-pull et arrowized sont-ils fondamentalement différents?

265

Je veux étudier FRP à Haskell, mais c'est un peu difficile de décider d'une bibliothèque à utiliser. Beaucoup semblent être des tentatives mortes, certains semblent avoir été ressuscités (comme la récente activité sur Yampa).

D'après ce que j'ai lu, il semble qu'il existe deux "types" de FRP: le FRP push-pull (comme dans Reactive-banana) d'un côté et le FRP fléché (comme dans Yampa) de l'autre côté. Il semble qu'il y ait également eu des "FRP classiques" à l'époque de Fran et FrTime, mais je n'ai pas repéré d'activité récente dans ces derniers.

  • Ces deux (ou trois) approches du PRF sont-elles vraiment fondamentalement différentes?

  • L'une d'elles est-elle une théorie dépassée alors que l'autre serait le "truc du futur"?

  • Ou doivent-ils évoluer en parallèle, à des fins différentes?

  • Ai-je nommé la bibliothèque la plus importante de chaque catégorie, ou y a-t-il d'autres options à considérer (Sodium, Netwire, et al)?


J'ai finalement regardé le discours d'Evan Czaplicki recommandé dans les commentaires de J. Abrahamson. C'est très intéressant et cela m'a aidé à clarifier les choses. Je le recommande vivement à tous ceux qui ont trouvé cette question intéressante.

Guillaume Ponce
la source
5
Vous pourriez être intéressé par l'opinion d'ertes (l'auteur du net): stackoverflow.com/a/13344292/414413
Cirdec
14
Très rapidement: reactive-bananaest définitivement basé sur le pull et non sur le push-pull. reactiveest push-pull. Yampaet netwiresont fléchés. Il y a des FRP qui permettent des "valeurs cumulées" mais ne permettent pas de "commuter", des FRP qui permettent des "commutations" mais pas des "valeurs cumulées". Les deux sont des FRP "simples". Le FRP fléché permet de commuter et d'accumuler et utilise des flèches pour contrôler le danger de combiner ces fonctionnalités. Monadique FRP comme reactive-banana, sodiumet elereautiliser d' autres mécanismes rigoureux afin de commutation et l' accumulation ne pas interagi trop.
J.Abrahamson
12
Le FRP fléché a également la fonctionnalité intéressante que les signaux sont toujours indiqués dans le contexte de leurs entrées, ce qui vous permet de transformer les sorties de manière covariante et les entrées de manière contravariante afin de mieux simuler le FRP interactif. Voir Interfaces utilisateur véritablement fonctionnelles par Courtney et Elliott pour un excellent exemple de cette fonctionnalité.
J.Abrahamson
9
Vous pourriez également être intéressé par la conférence "Contrôler le temps et l'espace" de l'auteur Elm Evan Czaplicki. À mon avis, il parvient à donner un bon aperçu de haut niveau sur l'espace de conception FRP et les compromis impliqués.
DanielM
3
Je pense que vous obtiendrez votre réponse ici .. stackoverflow.com/questions/10000074/…
Rushabh Shah

Réponses:

18

J'ai fait un voyage sur Haskell.org pour enquêter sur votre question. J'ai trouvé deux articles importants que vous devriez lire pour approfondir vos recherches, et je construis ma réponse à votre question à partir de ces articles savants.

Push-Pull FRP par Conal Elliott

Généraliser des monades en flèches par John Hughes


  1. Oui, mais aussi non. Selon Elliot, la poussée est une évaluation du PRF basée sur les données et la traction se rapporte à ce que l'on appelle une évaluation axée sur la «demande». L'auteur recommande pull car push a tendance à rester inactif entre les entrées de données. Voici l'essentiel: le push-pull combine et équilibre ces comportements dans le but principal de minimiser la nécessité de recalculer les valeurs. C'est simple; l'utilisation de FRP avec push-pull accélère la capacité de réaction. La flèche est une technique différente pour utiliser des types abstraits pour lier des valeurs et les évaluer simultanément. Tous ces concepts sont fondamentalement différents. Mais ne me croyez pas sur parole:

    La nature de l'interface Arrow est problématique dans le but d'une réévaluation minimale. Les événements et comportements d'entrée sont combinés en une seule entrée, qui change ensuite chaque fois qu'un composant change (Elliott).

    Ainsi, Arrow contredit l'objectif du push-pull. Cela ne signifie pas que vous ne pouvez pas utiliser tout cela à la fois, mais que ce serait complexe, et il y a certaines choses que vous ne pouvez pas calculer sans types de flèche abstraits.

  2. Je n'ai pas trouvé d'opinions savantes sur les approches qui sont «la voie de l'avenir». Notez seulement que les flèches peuvent particulièrement bien gérer la simultanéité. Si vous pouviez implémenter des flèches et utiliser le push-pull pour minimiser les calculs, ce serait la voie de l'avenir.

  3. Oui, ils répondent à des objectifs distincts. Comme je l'ai dit, ils peuvent être formulés ensemble, mais il est difficile à mettre en œuvre et même si cela fonctionne, cela annulerait probablement les avantages de vitesse réactive du push-pull.

  4. C'est subjectif, mais Reactive et Yampa semblent être les bibliothèques de langues les plus couramment citées pour FRP. Je dirais que Reactive de Conal Elliott a des racines profondes et Yampa est également établi. D'autres projets comme Netwire sont apparus en remplacement, mais cela pourrait prendre un certain temps avant de remplacer les géants.


J'espère que cela t'aides! Comme je l'ai dit, la lecture des articles que j'ai signalés vous donnera une meilleure idée de la distance sémantique entre la flèche, la poussée et la traction.

Kevin Caravaggio
la source