Как заставить TC в Haskell откладывать сообщения, как это могут делать очереди сообщений Эрланга? - PullRequest
10 голосов
/ 16 февраля 2010

Рассмотрим следующий код 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").

Вывод:

Root finished
One
Two
Final
Spawn finished

Обработка сообщения final по существу откладывается до последнего блока приема в силу предыдущих шаблонов приема, не соответствующих этому сообщению.

Как вы делаете это с TCK Haskell?

1 Ответ

3 голосов
/ 03 марта 2010

Вы имеете в виду функцию выборочного приема Эрланга. Насколько я знаю, STM в Haskell не имеет аналогов этому. Вы можете либо реорганизовать свой код, чтобы устранить необходимость в нем (например, используя отдельные очереди для различных типов информации, которую можно получить), либо реализовать эту функцию в библиотеке.

Семантика выборочного приема заключается в том, что помимо очереди входящих сообщений у вас также есть список отложенных сообщений. В функции приема вам нужно сначала отсканировать отложенный список на наличие подходящих сообщений. Если сообщение соответствует, вы удаляете его из списка и доставляете. Если не найдено ни одного отложенного сообщения, вам нужно дождаться сообщения в папке «Входящие». Когда сообщение получено, вы проверяете, соответствует ли оно. Если это так, то вы доставляете это; если нет, то вы помещаете его в отложенный список и повторяете.

...