Книга Блэкхита "Функциональное реактивное программирование", пояснение к разделу 2.6.3.
В разделе рассказывается об операции слияния при обработке потоков FRP (используется библиотека Sodium). Книга показывает диаграмму объединения потоков ниже и говорит, что, когда событие входит в логику FRP через поток, оно вызывает каскад изменений состояния, которые происходят в транзакционном контексте, поэтому все изменения являются атомарными.
Потоки событий - sDeselect
, sSelect
(см. 2 события: "+" и "-") происходят из элементов управления пользовательского интерфейса, так как они происходят в одной транзакции FRP, их переносимые события считаются одновременными. Тогда книга говорит
Реализация слияния должна хранить события во временном хранилище до тех пор, пока не узнает, что больше не будет получать входные данные. Затем он выводит событие: если он получил более одного, он использует предоставленную функцию для их объединения; в противном случае выводится одно событие, которое он получил.
Вопрос: когда наступит момент, когда "больше не будет ввода"? Как функция слияния знает этот момент? Это просто время, когда он получает значение из 2-го входящего потока на заданной диаграмме, или мне не хватает чего-то? Можете ли вы проиллюстрировать это лучшим примером потоков?
1 ответ
Для этого натрий назначает номера рангов структуре ориентированного графа логики FRP, хранящейся в памяти, таким образом, что если B зависит от A, то ранг B будет выше, чем A. (Циклы разбиты в обходе графа, который присваивает эти ранги.) Эти числа затем используются в качестве приоритетов в очереди с приоритетами, и сначала обрабатываются значения низкого ранга.
Во время обработки события, когда очередь с приоритетами не содержит ничего ниже ранга слияния, тогда известно, что для слияния больше не может быть входных данных, и она выведет значение.