2010-02-16 14 views
10

consideri il seguente codice Erlang:Come rendere il TChan di Haskell rinviare messaggi come le code di messaggi di Erlang possono?

-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"). 

Il risultato è:

Root finished 
One 
Two 
Final 
Spawn finished 

L'elaborazione del messaggio final sostanza differito fino all'ultimo blocco di ricezione in virtù delle precedenti ricezione modelli non corrispondenti che Messaggio.

Come si fa con il TChan di Haskell?

risposta

3

Ti riferisci alla funzione di ricezione selettiva di Erlang. Per quanto ne so, STM in Haskell non ha paralleli con esso. Le opzioni disponibili consentono di ridefinire il codice per eliminarne la necessità (ad esempio utilizzando code separate per i diversi tipi di informazioni che possono essere ricevute) o per implementare questa funzionalità in una libreria.

La semantica della ricezione selettiva è che oltre alla coda dei messaggi in entrata, è presente anche un elenco di messaggi differiti. Nella funzione di ricezione, è necessario prima eseguire la scansione dell'elenco posticipato per qualsiasi messaggio corrispondente. Se un messaggio corrisponde, lo rimuovi dall'elenco e lo recapiti. Se nessun messaggio differito corrisponde, è necessario attendere un messaggio nella Posta in arrivo. Quando viene ricevuto un messaggio, si controlla se corrisponde. Se lo fa, lo consegni; in caso contrario, lo si spinge alla lista posticipata e si ripete.

+2

Concordato. Queste semantiche non esistono nei pacchetti base 'Chan' o' TChan' - dovrai implementare una coda di differimento da solo. –