То, как заставить TChan Haskell задержать сообщения как очереди сообщений Erlang, может?

Рассмотрите следующий код 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 сообщение по существу задерживается, пока последние не получают блок на основании предыдущего, получают шаблоны, не соответствующие тому сообщению.

Как дела это с TChan Haskell?

10
задан Don Stewart 4 May 2011 в 16:29
поделиться

1 ответ

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

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

3
ответ дан 4 December 2019 в 04:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: