Функциональное реактивное программирование - Functional reactive programming
Эта статья предоставляет недостаточный контекст для тех, кто не знаком с предметом.Апрель 2015 г.) (Узнайте, как и когда удалить этот шаблон сообщения) ( |
Функциональное реактивное программирование (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.
Смотрите также
Рекомендации
- ^ Эллиотт, Конал; Худак, Павел. «Функциональная реактивная анимация». Функциональная реактивная анимация. ICFP ’97. Получено 14 июля 2018.
- ^ Нильссон, Хенрик; Кортни, Энтони; Петерсон, Джон (февраль 2011 г.) [2002 г.], «Функциональное реактивное программирование, продолжение», Мастерская Haskell (PDF).
- ^ Эллиотт, Конал; Худак, Пол (1997), «Функциональная реактивная анимация», ICFP.
- ^ Кортни, Энтони; Эллиотт, Конал (февраль 2011 г.) [2001 г.], «Подлинно функциональные пользовательские интерфейсы» (PDF), Мастерская Haskell, Йель.
- ^ Таха, Валид; Ван, Чжаньонг; Худак, Пол (2002), «Событийный FRP», PADL (PDF), Йель, архивировано из оригинал (PDF) в 2013-09-28, получено 2013-09-23.
- ^ Чаплицкий, Эван; Чонг, Стивен (2013), «Асинхронное функциональное реактивное программирование для графического интерфейса пользователя», PLDI, Гарвард.
- ^ Ван, Чжаньонг; Таха, Валид; Худак, Пол (февраль 2011 г.), «FRP в реальном времени», ICFP (PDF), заархивировано из оригинал (PDF) в 2013-09-28, получено 2013-09-23.
- ^ http://conal.net/blog/posts/why-classic-frp-does-not-fit-interactive-behavior
- ^ https://courses.cs.washington.edu/courses/cse505/01au/functional/functional-io.pdf
- ^ http://www.cse.chalmers.se/~hallgren/Thesis/
- ^ Перес, Иван; Баренц, Мануэль; Нильссон, Хенрик (июль 2016 г.), «Функциональное реактивное программирование с рефакторингом», Симпозиум Haskell (PDF).
- ^ «Архивная копия» (PDF). Архивировано из оригинал (PDF) на 2015-07-01. Получено 2015-07-24.CS1 maint: заархивированная копия как заголовок (связь)
- ^ Чаплицки, Эван (апрель 2012 г.), Elm: параллельный FRP для функциональных графических интерфейсов (PDF) (диссертация), Гарвард, архив из оригинал (PDF ) на 2016-06-04, получено 2015-02-17.
- ^ Чаплицкий, Эван. «Прощание с FRP». вяз. Получено 14 июля 2018.
внешняя ссылка
- Cellx - сверхбыстрая реализация реактивности для JavaScript
- Исследование FRP, связанное с Haskell
- "Устарение паттерна наблюдателя в Scala.React, "- Scala.React, реализация FRP Scala
- Что такое (функциональное) реактивное программирование? - Ответы на переполнение стека
- Функциональное реактивное программирование: дизайн функциональных программ на Scala - Лекция от École Polytechnique Fédérale de Lausanne с Coursera курс «Функциональный программный дизайн в Scala ", к Мартин Одерский