Функциональное реактивное программирование ( FRP) - это парадигма программирования для реактивного программирования ( асинхронное программирование потока данных ) с использованием строительных блоков функционального программирования (например, отображение, сокращение, фильтр ). FRP использовался для программирования графических пользовательских интерфейсов (GUI), робототехники, игр и музыки, чтобы упростить эти проблемы путем явного моделирования времени.
Исходную формулировку функционального реактивного программирования можно найти в статье ICFP 97 «Функциональная реактивная анимация» Конала Эллиотта и Пола Худака.
С момента своего появления в 1997 году FRP принял множество форм. Одна ось разнообразия - дискретная и непрерывная семантика. Другая ось - это то, как системы FRP могут быть изменены динамически.
Самая ранняя формулировка FRP использовала непрерывную семантику, стремясь абстрагироваться от многих рабочих деталей, которые не важны для смысла программы. Ключевые свойства этой рецептуры:
Эта семантическая модель FRP в языках без побочных эффектов обычно выражается в виде непрерывных функций и, как правило, с течением времени.
Формулировки, такие как Event-Driven FRP и версии Elm до 0.17, требуют, чтобы обновления были дискретными и управляемыми событиями. Эти формулировки подтолкнули к практическому использованию FRP с упором на семантику, которая имеет простой API, который может быть эффективно реализован в таких настройках, как робототехника или в веб-браузере.
В этих формулировках обычно идеи поведения и событий объединяются в сигналы, которые всегда имеют текущее значение, но изменяются дискретно.
Было указано, что обычная модель FRP, от входов до выходов, плохо подходит для интерактивных программ. Отсутствие возможности «запускать» программы в сопоставлении от входов к выходам может означать, что необходимо использовать одно из следующих решений:
planNow :: Event (IO a) -gt; IO (Event a)
Существует два типа систем FRP: push-based и pull-based. Системы на основе push-уведомлений принимают события и проталкивают их через сигнальную сеть для достижения результата. Системы на основе вытягивания ждут, пока не потребуется результат, и работают в обратном направлении по сети, чтобы получить требуемое значение.
Некоторые системы FRP, такие как Yampa, используют выборку, при которой образцы извлекаются сигнальной сетью. У этого подхода есть недостаток: сеть должна ждать до продолжительности одного шага вычислений, чтобы узнать об изменениях на входе. Выборка является примером FRP на основе извлечения.
Библиотеки Reactive и Etage на Hackage представили подход, называемый push-pull FRP. В этом подходе, это событие создается только тогда, когда требуется следующее событие в чисто определенном потоке (таком как список фиксированных событий с указанием времени). Эти чисто определенные потоки действуют как ленивые списки в Haskell. Это половина, основанная на притяжении. Половина на основе push используется, когда вводятся внешние по отношению к системе события. Внешние события отправляются потребителям, чтобы они могли узнать о событии в тот момент, когда оно было выпущено.