2010-02-16 3 views
10

Considérons le code Erlang suivant:Comment faire pour que les TChan de Haskell diffèrent les messages comme les files d'attente de messages d'Erlang?

-module(testit). 
-export([testit/0]). 

testit() -> 
    Pid = spawn(fun testit_proc/0), 
    Pid ! final, 
    Pid ! one, 
    Pid ! two, 
    io:format("Root finished~n"). 

testit_proc() -> 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n") 
    end, 
    receive 
     one  -> io:format("One~n"); 
     two  -> io:format("Two~n"); 
     final -> io:format("Final~n") 
    end, 
    io:format("Spawn finished~n"). 

La sortie est la suivante:

Root finished 
One 
Two 
Final 
Spawn finished 

Le traitement du message final est essentiellement différée jusqu'à ce que le dernier bloc de réception, en vertu des recevoir des modèles précédents ne correspond que message.

Comment faites-vous cela avec TChan de Haskell?

Répondre

3

Vous faites référence à la fonction de réception sélective d'Erlang. Pour autant que je sache, STM à Haskell n'a pas de parallèle. Vous pouvez soit refactoriser votre code pour en supprimer le besoin (par exemple en utilisant des files d'attente distinctes pour les différents types d'informations pouvant être reçues), soit implémenter cette fonctionnalité dans une bibliothèque. La sémantique de réception sélective est qu'en plus de la file d'attente des messages entrants, vous avez également une liste de messages différés. Dans la fonction de réception, vous devez d'abord analyser la liste différée pour les messages correspondants. Si un message correspond, vous le supprimez de la liste et vous le livrez. Si aucun message différé ne correspond, vous devez attendre un message dans la boîte de réception. Lorsqu'un message est reçu, vous vérifiez s'il correspond. Si c'est le cas, alors vous le livrez; sinon, vous poussez sur la liste différée et répétez.

+2

D'accord. Ces sémantiques n'existent pas dans les paquets de base 'Chan' ou' TChan' - vous devrez implémenter vous-même une file d'attente différée. –

Questions connexes