Реактивно-банановые задержки

Я изучил документацию по реактивному банану и не могу найти способ указать явные задержки. Скажем, например, я хотел бы взять Event t a и перенести все его события на 1 секунду в будущее; или получить событие, которое начинается через 1 секунду (в течение Moment t); или что-нибудь в этом роде. Представлены ли явные задержки в реактивном банане? Если нет, то как пользователи реализуют, например, повторение ввода с задержкой на секунду?

2 ответа

Решение

Как указывает Бен, это правильно: "реактивный банан" не является встроенным понятием времени и задержек.

Основная причина в том, что трудно гарантировать, что логическое время и реальное время совпадают. Что происходит, когда щелчок мыши происходит в реальном времени до логического времени события, которое еще не может быть рассчитано, то есть чье реальное время отстает от своего логического времени?

Однако все еще возможно иметь дело со временем, используя события внешнего таймера. Посмотрите на пример Wave.hs.

Я ни в коем случае не эксперт, но я использовал более старый реактивный банан для программы именно с этой необходимостью (к сожалению, на данный момент у меня нет кода под рукой).

Я думаю, что явные задержки не вписываются сверхъестественно в структуру реактивного банана, потому что вы всегда неявно имеете дело с каким-то абстрактным временем. Задержка на определенные промежутки времени требует понимания реального времени. Я вижу, что было бы очень трудно сказать, что-то вроде union event (delay 1.0 event) будет означать с точки зрения авторитетной модели, где type Event a = [Maybe a]: должно быть [a, b, a, b] или же [a, a, b, b]? Как я уже размышлял, проблема в том, что из этих двух результатов не определено, без учета деталей времени выполнения.

Но вы можете сделать это "вокруг" реактивно-банановой среды, подключив действие ввода-вывода к событию, которое вы хотите отложить, которое спит некоторое время (очевидно, не в основном потоке), а затем запускает другое событие. Я считаю, что смог обернуть всю эту логику в функцию, которую я мог вызвать из NetworkDescription монада (это было до Moment Монада существовала), чтобы получить мое новое отложенное событие.

Другие вопросы по тегам