Функциональное реактивное программирование - Functional reactive programming

Функциональное реактивное программирование (FRP) это парадигма программирования за реактивное программирование (асинхронный программирование потока данных ) с использованием строительных блоков функциональное программирование (например. карта, уменьшать, фильтр ). FRP использовался для программирования графический пользовательский интерфейс (GUI), робототехника, игры и музыку, стремясь упростить эти проблемы путем явного моделирования времени.[нужна цитата ]

Составы FRP

Исходную формулировку функционального реактивного программирования можно найти в статье ICFP 97 «Функциональная реактивная анимация» автора. Конал Эллиотт и Пол Худак.[1]

С момента своего появления в 1997 году FRP принял множество форм. Одна ось разнообразия - дискретная и непрерывная семантика. Другая ось - это то, как системы FRP могут быть изменены динамически.[2]

Непрерывный

Самая ранняя формулировка FRP использовала непрерывную семантику, стремясь абстрагироваться от многих рабочих деталей, которые не важны для смысла программы.[3] Ключевые свойства этой рецептуры:

  • Значения моделирования, которые изменяются с течением времени, называются «поведением», а затем «сигналами».
  • Моделирование »События "которые происходят в дискретные моменты времени.
  • Система может быть изменена в ответ на события, обычно называемые «переключением».
  • Отделение деталей оценки, таких как частота дискретизации, от реактивной модели.

Эта семантическая модель FRP в побочный эффект бесплатные языки обычно выражаются в виде непрерывных функций и обычно во времени.[4]

Дискретный

Формулировки, такие как Event-Driven FRP и версии Вяз до 0.17 требуют, чтобы обновления были дискретными и управляемыми событиями.[5] Эти формулировки подтолкнули к практическому использованию FRP с упором на семантику, которая имеет простой API, который может быть эффективно реализован в таких условиях, как робототехника или в веб-браузере.[6]

В этих формулировках обычно идеи поведения и событий объединяются в сигналы, которые всегда имеют текущее значение, но изменяются дискретно.[7]

Интерактивный FRP

Было отмечено, что обычная модель FRP, от входов до выходов, плохо подходит для интерактивных программ.[8] Отсутствие возможности «запускать» программы в сопоставлении входов и выходов может означать, что необходимо использовать одно из следующих решений:

  • Создайте структуру данных действий, которые появляются как выходы. Действия должны выполняться внешним интерпретатором или средой. Это наследует все трудности исходной системы потокового ввода-вывода Haskell.[9]
  • Используйте Arrowized FRP и вставьте стрелки, которые способны выполнять действия. Действия также могут иметь идентификаторы, что позволяет им, например, поддерживать отдельные изменяемые хранилища. Это подход, используемый библиотекой Fudgets[10] и, в более общем смысле, функции монадического потока.[11]
  • Новый подход состоит в том, чтобы разрешить выполнение действий сейчас (в монаде ввода-вывода), но отложить получение их результатов на потом.[12] Это использует взаимодействие между монадами Event и IO и совместимо с FRP, более ориентированным на выражения:
planNow :: Event (IO a) -> IO (Событие a)

Проблемы реализации

Существует два типа систем FRP: push-based и pull-based. Системы на основе push-уведомлений принимают события и проталкивают их через сигнальную сеть для достижения результата. Системы на основе вытягивания ждут, пока не потребуются результаты, и работают в обратном направлении по сети, чтобы получить требуемое значение.

Некоторые системы FRP, такие как Yampa, используют выборку, при которой образцы извлекаются сигнальной сетью. У этого подхода есть недостаток: сеть должна ждать до одного шага вычислений, чтобы узнать об изменениях на входе. Выборка является примером FRP на основе извлечения.

Библиотеки Reactive и Etage на Взлом представил подход, называемый двухтактным FRP. В этом подходе, только когда требуется следующее событие в чисто определенном потоке (например, список фиксированных событий с указанием времени), это событие создается. Эти чисто определенные потоки действуют как ленивые списки в Haskell. Это половина, основанная на притяжении. Половина на основе push-уведомлений используется, когда вводятся внешние по отношению к системе события. Внешние события отправляются потребителям, чтобы они могли узнать о событии в тот момент, когда оно было выпущено.

Реализации

  • Ямпа стрелка, эффективный, чистый Haskell реализация с поддержкой SDL, SDL2, OpenGL и HTML DOM.
  • Язык программирования Вяз используется для поддержки FRP [13] но с тех пор заменил его другим шаблоном [14]
  • рефлекс эффективная реализация push / pull FRP в Haskell с хостами для браузер /ДОМ, SDL и глянец.
  • реактивно-банановый является целевой независимой реализацией push FRP в Haskell.
  • сеть и различный обозначены стрелками, вытяните реализации FRP в Haskell.
  • Flapjax реализация FRP поведения / события в JavaScript.
  • Реагировать является OCaml модуль функционального реактивного программирования.
  • Натрий - это реализация push FRP, независимая от конкретной инфраструктуры пользовательского интерфейса для нескольких языков программирования, таких как Java, TypeScript и C #.
  • ReactiveX, популярный благодаря JavaScript выполнение rxjs, представляет собой комплексную кроссплатформенную парадигму для реализации функционального реактивного программирования, обрабатывая данные как потоки наблюдаемых.
  • Дунай это быстрая реализация на Haskell с использованием Монадические потоковые функции который поддерживает классический и Arrowized FRP.

Смотрите также

Рекомендации

  1. ^ Эллиотт, Конал; Худак, Павел. «Функциональная реактивная анимация». Функциональная реактивная анимация. ICFP ’97. Получено 14 июля 2018.
  2. ^ Нильссон, Хенрик; Кортни, Энтони; Петерсон, Джон (февраль 2011 г.) [2002 г.], «Функциональное реактивное программирование, продолжение», Мастерская Haskell (PDF).
  3. ^ Эллиотт, Конал; Худак, Пол (1997), «Функциональная реактивная анимация», ICFP.
  4. ^ Кортни, Энтони; Эллиотт, Конал (февраль 2011 г.) [2001 г.], «Подлинно функциональные пользовательские интерфейсы» (PDF), Мастерская Haskell, Йель.
  5. ^ Таха, Валид; Ван, Чжаньонг; Худак, Пол (2002), «Событийный FRP», PADL (PDF), Йель, архивировано из оригинал (PDF) в 2013-09-28, получено 2013-09-23.
  6. ^ Чаплицкий, Эван; Чонг, Стивен (2013), «Асинхронное функциональное реактивное программирование для графического интерфейса пользователя», PLDI, Гарвард.
  7. ^ Ван, Чжаньонг; Таха, Валид; Худак, Пол (февраль 2011 г.), «FRP в реальном времени», ICFP (PDF), заархивировано из оригинал (PDF) в 2013-09-28, получено 2013-09-23.
  8. ^ http://conal.net/blog/posts/why-classic-frp-does-not-fit-interactive-behavior
  9. ^ https://courses.cs.washington.edu/courses/cse505/01au/functional/functional-io.pdf
  10. ^ http://www.cse.chalmers.se/~hallgren/Thesis/
  11. ^ Перес, Иван; Баренц, Мануэль; Нильссон, Хенрик (июль 2016 г.), «Функциональное реактивное программирование с рефакторингом», Симпозиум Haskell (PDF).
  12. ^ «Архивная копия» (PDF). Архивировано из оригинал (PDF) на 2015-07-01. Получено 2015-07-24.CS1 maint: заархивированная копия как заголовок (связь)
  13. ^ Чаплицки, Эван (апрель 2012 г.), Elm: параллельный FRP для функциональных графических интерфейсов (PDF) (диссертация), Гарвард, архив из оригинал (PDF ) на 2016-06-04, получено 2015-02-17.
  14. ^ Чаплицкий, Эван. «Прощание с FRP». вяз. Получено 14 июля 2018.

внешняя ссылка