Comment les Futures sont-ils décrits en termes de théorie des catégories?


Réponses:


25

En l'occurrence, j'écris un article à ce sujet maintenant. OMI, une bonne façon de penser aux futurs ou aux promesses est en termes de correspondance Curry-Howard pour la logique temporelle .

Fondamentalement, l'idée derrière les futurs est qu'il s'agit d'une structure de données représentant un calcul en cours et sur lequel vous pouvez synchroniser. En termes de logique temporelle, c'est l'opérateur éventuellement . Cela a une structure monadique: r e t u r n : A A b i n d : ( A B ) AB dans laquelle le r e t u r nUNE

return:UNEUNEbjen:(UNEB)UNEB
returnopération génère un processus qui retourne immédiatement son argument, et crée un nouveau processus qui attend un de valeur, applique f à cette valeur, puis attend le B -valeur avant de revenir. La proposition Promises / A pour CommonJS appelle l'opération de liaison monadique , et Scala 2.10 lui donne simplement l'interface monadique standard .bjenuneFBthen

Le double à l'opérateur éventuellement est l'opérateur toujours A la logique temporelle, qui dit que , à chaque instant, vous obtenez un A . Lorsque vous passez d'une sémantique de Kripke de logique temporelle (où vous modélisez simplement la prouvabilité) à une sémantique catégorielle d'un λ -calcul (où vous modélisez également des termes / preuves lambda), il s'avère qu'il existe en fait plusieurs façons de le faire.UNEUNEUNEλ

UNEUNEUNE

La chose la plus naturelle (OMI) à faire est de prendre , ce qui vous permet d'obtenir un (potentiellement différent) à chaque instant. Ensuite, vous pouvez voir le style comonadique de programmation réactive fonctionnelle (FRP) (proposé pour la première fois par Tarmo Uustalu et Varmo Vene ) comme le style de programmation dual à monadique avec les futurs.UNEStreunemUNEUNE

Cependant, le -calculus comonadique comme ils le suggèrent, malgré son élégance, provoque une sérieuse perte d'expressivité par rapport à la programmation explicite avec des flux, car la catégorie de charbon de bois libre qu'ils utilisent s'avère avoir trop peu d'éléments globaux pour dénoter de nombreux programmes intéressants , en particulier les points fixes.λ

Nick Benton et moi-même avons plaidé pour une programmation explicite avec des flux dans notre article Ultrametric Semantics of Reactive Programs . Par la suite, Alan Jeffrey a suggéré d'utiliser le LTL comme système de types dans son article LTL types FRP , une observation que Wolfgang Jeltsch a également faite dans son article Towards a Common Categorical Semantics for Linear-Time Tempic Logic and Functional Reactive Programming .

La différence entre la vue Nick et je prends, et celui que Alan et Wolfgang prendre est mieux comprise (OMI) en comparant la construction donnée dans Birkedal et al de. Premiers pas dans la théorie de domaine surveillé synthétique: étape-indexation dans les topos d'arbres avec le papier d'Alan. Les topos des arbres (préfiltres sur les nombres naturels classés par taille) sont très similaires à la catégorie des espaces ultramétriques que Nick et moi avons utilisés, mais beaucoup plus faciles à comparer avec la catégorie d'Alan (préfiltres sur une catégorie de temps discrète), car ce sont tous les deux des préfiltres catégories.

Si vous êtes intéressé par les contrats à terme spécifiquement pour la concurrence, alors ce serait peut-être une meilleure idée de regarder CTL plutôt que LTL, cependant. AFAIK, c'est un territoire actuellement inexploré!

EDIT: voici un lien vers le brouillon . Le document traite principalement de l'implémentation de FRP typé, donc le langage est synchrone. Mais la majeure partie de la discussion sur les futurs / événements dans la section 3.3 devrait également s'appliquer fondamentalement aux langages réellement concurrents.


1
J'adorerais en obtenir une copie lorsque vous aurez terminé.
Dave Clarke

1
UNEUNE

J'ai lu récemment que le type Scala Try[T]et Future[T]sont doubles, mais je n'ai pas tout à fait compris ce que cela signifie / dans quel sens.
Giorgio
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.