Haskell Reactive-Banana FRP и цикл событий

Я все еще пытаюсь понять Haskell и FRP. В частности, я проработал несколько примеров с использованием пакета reactive-banana и начал получать FRP.

Однако я до сих пор не понимаю, как сеть событий узнает, когда произошло входное событие. Насколько я понимаю, в отличие от NodeJS, в котором цикл обработки событий постоянно проверяет пользовательский ввод, FRP использует другую структуру для «ожидания» или «проверки» пользовательского ввода или внешних сигналов.

Насколько я читал, FRP делает время явным. Связывая время либо с событием, либо с поведением, сеть каким-то образом всегда знает, когда срабатывает внешний стимул.

Я прочитал много статей Конала, Худака и др. и объяснения слишком технические. Пожалуйста, предоставьте меньше технических объяснений.

Спасибо за вашу помощь.


person phage    schedule 01.06.2016    source источник
comment
Я думаю, что большинство из них просто обманывают их в свои события, используя настоящий ввод-вывод – например, это использует SDL-таймеры для подкачки времени - насколько я понимаю, вы используете аналогичные вещи (ваши обычные императивные/асинхронные/событийные IO вещи) для создания основы (см. -Frameworks.html" rel="nofollow noreferrer">здесь)   -  person Random Dev    schedule 01.06.2016
comment
Я написал несколько примеров подключения библиотек FRP к реальному пользовательскому интерфейсу. пример подключения реактивного банана к GLUT демонстрирует запуск событий из реальные операции ввода-вывода. пример подключения реактивного банана к глянцу демонстрирует пошаговые события в явном цикле событий, но делает обход через ввод-вывод, чтобы использовать существующая поддержка в Reactive.Banana.Frameworks.   -  person Cirdec    schedule 01.06.2016


Ответы (1)


Полезно помнить о различиях между FRP, который связан с созданием интересных Event и Behavior из базовых, и специфичным для платформы «связующим кодом», который предоставляет набор основных Event, таких как текущая позиция мыши или нажатия на клавиатуру.

В библиотеке Reactive-Banana это различие отражено в структуре модуля: Reactive.Banana.Combinators относится к первой части, а Reactive.Banana.Frameworks — ко второй части.

Теперь понимание того, как работает вторая часть (базовая Events), не важно для понимания того, как работает первая часть (FRP); на самом деле разные библиотеки могут делать очень разные варианты реализации.

Тем не менее, в библиотеке Reactive-Banana сеть событий — это, по сути, огромная функция обратного вызова, которая регистрируется во внешних источниках событий (называемых AddHandler в библиотеке). Всякий раз, когда один из этих внешних источников вызывает функцию обратного вызова, последняя будет проходить по графу Event и Behavior в порядке зависимости, выполнять необходимые обновления внутреннего состояния и, наконец, выполнять действия, ранее зарегистрированные с помощью reactimate.

Магия FRP заключается в том, что пользователь библиотеки не видит ни одной из этих деталей реализации, хотя иногда полезно знать, что «сеть событий = огромная функция обратного вызова».

person Heinrich Apfelmus    schedule 02.06.2016
comment
Спасибо Генриху за ответ. Я многому научился из вашей работы. Очень признателен. У меня вопрос вдогонку. Вы называете поток и взаимосвязь между событиями и поведением сетью событий. Это то же самое, что график? - person phage; 07.06.2016
comment
@phage Да, по сути, они означают одно и то же. Я делаю небольшое различие: обычно я использую график для обозначения событий, поведения и их соединений, а сеть для обозначения этого в сочетании с действиями ввода-вывода и зарегистрированными обработчиками событий. Другими словами, я думаю о первом как о чистом, а о втором как о нечистом. Но на самом деле это всего лишь небольшое различие в номенклатуре, которое мне нравится делать, чтобы добавить немного большей точности, когда я пишу об этом. - person Heinrich Apfelmus; 07.06.2016