Почему нет функций для построения событий из не-событий в реактивном банане?

Я нахожусь в процессе обучения FRP и Reactive-banana, в то время как я пишу, что, я надеюсь, будет более полезным уроком для тех, кто следует за мной. Вы можете проверить мой прогресс в обучении здесь.

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

reactimate $ fmap (uncurry playNote) myEvent

в моем NetworkDescription, но я не могу понять, как просто заставить сеть делать то же самое повторно или делать что-то один раз. В идеале я ищу такие вещи:

once :: a -> Event t a
repeatWithDelay :: Event t a -> Time -> Event t a
concatWithDelay :: Event t a -> Event t a -> Time -> Event t a

Time вышеприведенный тип является просто заменой любого измерения времени, которое мы используем в конечном итоге. Нужно ли подключать системное время как поведение для управления функциями "задержки"? Это кажется сложнее, чем необходимо.

Заранее спасибо,

Эхо Нолан

РЕДАКТИРОВАТЬ: Хорошо, типы для repeatWithDelay и concatWithDelay не имеют смысла. Вот что я на самом деле имел в виду.

repeatWithDelay :: a -> Time -> Event t a
concatWithDelay :: a -> a -> Time -> Event t a

1 ответ

Решение

Я решил пока не включать такие функции в базовую модель, потому что время порождает различные проблемы для согласованности. Например, если два события запланированы на 5 секунд, должны ли они быть одновременными? Если нет, какой из них должен прийти первым? Я думаю, что основная модель должна поддаваться формальному доказательству, но это не работает с фактическими измерениями физического времени.

Тем не менее, я планирую включить такие функции по принципу "они работают, но без гарантий". Основная причина, по которой я этого еще не сделал, заключается в том, что нет канонического выбора для измерения времени. Разные приложения имеют разные потребности, иногда вам нужно наносекундное разрешение, иногда вы хотите использовать таймеры из вашей структуры GUI, а иногда вы хотите синхронизироваться с внешними часами MIDI. Другими словами, вы хотите, чтобы основанная на времени функция работала в общем случае со многими реализациями таймеров, и только для реактивного-banana-0.7.0 я нашел для этого хороший дизайн API.

Конечно, уже можно реализовать свою собственную функцию, основанную на времени, используя таймеры. Пример Wave.hs демонстрирует, как это сделать. Другой пример - библиотека реактивного бальза Хеннинга Тилеманна, которая реализует различные основанные на времени комбинаторы для обработки MIDI-данных в реальном времени.

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