Функциональное реактивное программирование
Функциональное реактивное программирование ( FRP ) — это парадигма программирования для реактивного программирования ( асинхронного программирования потоков данных ) с использованием строительных блоков функционального программирования (например, карты , сокращения , фильтра ). FRP использовался для программирования графических пользовательских интерфейсов (GUI), робототехники , игр и музыки с целью упростить эти проблемы за счет явного моделирования времени. [ нужна ссылка ]
Составы FRP [ править ]
Оригинальную формулировку функционального реактивного программирования можно найти в статье ICFP 97 «Функциональная реактивная анимация» Конала Эллиотта и Пола Худака . [1]
FRP принял множество форм с момента его появления в 1997 году. Одной из осей разнообразия является дискретная и непрерывная семантика. Другая ось — это то, как можно динамически изменять системы FRP. [2]
Непрерывный [ править ]
Самая ранняя формулировка FRP использовала непрерывную семантику, стремясь абстрагироваться от многих рабочих деталей, которые не важны для смысла программы. [3] Ключевые свойства этого препарата:
- Значения моделирования, которые изменяются в течение непрерывного времени, называются «поведениями», а позже «сигналами».
- Моделирование « событий », происходящих в дискретные моменты времени.
- Система может быть изменена в ответ на события, обычно называемые «переключением».
- Отделение деталей оценки, таких как частота дискретизации, от реактивной модели.
Эта семантическая модель FRP в языках без побочных эффектов обычно представляет собой непрерывные функции и, как правило, во времени. [4] Эта формулировка также называется денотативным программированием в непрерывном времени (DCTP). [5]
Дискретный [ править ]
Такие формулы, как Event-Driven FRP и версии Elm до 0.17, требуют, чтобы обновления были дискретными и управляемыми событиями. [6] Эти формулировки подтолкнули к практическому FRP, сосредоточив внимание на семантике с простым API, который можно эффективно реализовать в таких условиях, как робототехника или в веб-браузере. [7]
В этих формулировках обычно идеи поведения и событий объединяются в сигналы, которые всегда имеют текущее значение, но изменяются дискретно. [8]
Интерактивный FRP [ править ]
Было отмечено, что обычная модель FRP, от ввода до вывода, плохо подходит для интерактивных программ. [9] Отсутствие возможности «запускать» программы в рамках сопоставления входов и выходов может означать, что необходимо использовать одно из следующих решений:
- Создайте структуру данных действий, которые появляются в качестве выходных данных. Действия должны запускаться внешним интерпретатором или средой. Это унаследовало все трудности исходной системы потокового ввода/вывода (I/O) Haskell . [10]
- Используйте Arrowized FRP и встраивайте стрелки, способные выполнять действия. Действия также могут иметь идентификаторы, что позволяет им, например, поддерживать отдельные изменяемые хранилища. Это подход, используемый библиотекой Fudgets. [11] и, в более общем плане, монадические потоковые функции. [12]
- Новый подход заключается в том, чтобы позволить действиям выполняться сейчас (в монаде IO), но отложить получение их результатов на более позднее время. [13] Это использует взаимодействие между монадами Event и IO и совместимо с более ориентированным на выражение FRP:
planNow :: Event (IO a) -> IO (Event a)
Проблемы реализации [ править ]
Существует два типа систем FRP: выталкивающие и вытягивающие. Системы, основанные на push-уведомлениях, принимают события и пропускают их через сигнальную сеть для достижения результата. Системы на основе извлечения ждут, пока не потребуется результат, и работают в обратном направлении по сети, чтобы получить требуемое значение.
Некоторые системы FRP, такие как Yampa, используют выборку, при которой образцы извлекаются из сигнальной сети. У этого подхода есть недостаток: сеть должна ждать в течение одного шага вычислений, чтобы узнать об изменениях входных данных. Выборка является примером FRP на основе вытягивания.
Библиотеки Reactive и Etage на Hackage представили подход, называемый push-pull FRP. В нем это событие создается только тогда, когда требуется следующее событие в чисто определенном потоке (например, список фиксированных событий с указанием времени). Эти чисто определенные потоки действуют в Haskell как ленивые списки . Это половина, основанная на вытягивании. Половина, основанная на рассылке, используется, когда вводятся события, внешние по отношению к системе. Внешние события передаются потребителям, чтобы они могли узнать о событии в момент его возникновения.
Реализации [ править ]
Реализации существуют для многих языков программирования , в том числе:
- Yampa — это эффективная и чистая реализация Haskell с стрелками , с поддержкой SDL, SDL2, OpenGL и HTML DOM.
- Язык, используемый Elm для поддержки FRP [14] но с тех пор заменил его другим образцом. [15]
- reflex — это эффективная двухтактная реализация FRP на Haskell с хостами для веб-браузера — объектная модель документа (DOM), Simple DirectMedia Layer (SDL) и Gloss.
- reactive-banana — это независимая от цели реализация push-FRP в Haskell.
- netwire и другие варианты отмечены стрелками, извлеките реализации FRP в Haskell.
- Flapjax — это реализация FRP на основе поведения и событий на JavaScript .
- React — это модуль OCaml для функционального реактивного программирования.
- Sodium — это реализация принудительного FRP, независимая от конкретной инфраструктуры пользовательского интерфейса (UI) для нескольких языков, таких как Java , TypeScript и C# .
- Dunai — это быстрая реализация на Haskell с использованием монадических потоковых функций , которая поддерживает классический и стрелочный FRP.
- ObservableComputations — кроссплатформенная реализация .NET .
- Stella — это реактивный язык, основанный на модели актеров , который демонстрирует модель «актеров» и «реакторов», целью которой является избежать проблем объединения императивного кода с реактивным кодом (путем разделения их на актеров и реакторы). [16] Актеры подходят для использования в распределенных реактивных системах. [17]
- TidalCycles — это чистый доменно-ориентированный язык FRP для музыкальных шаблонов, встроенный в язык Haskell .
ReactiveX , популяризированный благодаря реализации rxjs на JavaScript , является функциональным и реактивным, но отличается от функционального реактивного программирования. [18]
См. также [ править ]
Ссылки [ править ]
- ^ Эллиотт, Конал; Худак, Павел. «Функциональная реактивная анимация» . Функциональная реактивная анимация . МКФП '97 . Проверено 14 июля 2018 г.
- ^ Нильссон, Хенрик; Кортни, Энтони; Петерсон, Джон (февраль 2011 г.) [2002], «Функциональное реактивное программирование, продолжение», Haskell Workshop (PDF)
- ^ Эллиотт, Конал; Худак, Пол (1997), «Функциональная реактивная анимация» , ICFP
- ^ Кортни, Энтони; Эллиотт, Конал (февраль 2011 г.) [2001], «Подлинно функциональные пользовательские интерфейсы» , Haskell Workshop , Йельский университет.
- ^ Эллиот, Конал (2014), «Денотативный дизайн» (PDF) , LambdaJam , получено 5 мая 2023 г.
- ^ Таха, Валид; Ван, Чжанюн; Худак, Пол (2002), «FRP, основанный на событиях», PADL (PDF) , Йельский университет, заархивировано из оригинала (PDF) 28 сентября 2013 г. , получено 23 сентября 2013 г.
- ^ Чаплицки, Эван; Чонг, Стивен (2013), «Асинхронное функционально-реактивное программирование для графических интерфейсов» , PLDI , Гарвард
- ^ Ван, Чжанюн; Таха, Валид; Худак, Пол (февраль 2011 г.), «FRP в реальном времени», ICFP (PDF) , заархивировано из оригинала (PDF) 28 сентября 2013 г. , получено 23 сентября 2013 г.
- ^ Эллиотт, Конал (9 декабря 2008 г.). «Почему классический FRP не подходит для интерактивного поведения» . Архивировано из оригинала 12 октября 2022 г.
- ^ Борнинг, Алан. «Ввод-вывод на чисто функциональных языках» (PDF) . Архивировано (PDF) из оригинала 28 апреля 2022 г.
- ^ Карлссон, Магнус; Халлгрен, Томас (1998). «Fudgets - чисто функциональные процессы с приложениями к графическим пользовательским интерфейсам» (PDF) . Архивировано (PDF) из оригинала 15 октября 2022 г.
- ^ Перес, Иван; Баренц, Мануэль; Нильссон, Хенрик (июль 2016 г.), «Функциональное реактивное программирование, рефакторинг», Симпозиум Haskell (PDF)
- ^ Аце ван дер Плог; Классен, Коэн. «Практический принцип FRP» (PDF) . Архивировано из оригинала (PDF) 1 июля 2015 г. Проверено 24 июля 2015 г.
- ^ Чаплицки, Эван (апрель 2012 г.), Elm: Concurrent FRP для функциональных графических интерфейсов пользователя (PDF) (диссертация), Гарвард, заархивировано из оригинала (PDF) 4 июня 2016 г. , получено 17 февраля 2015 г.
{{citation}}
: CS1 maint: отсутствует местоположение издателя ( ссылка ) - ^ Чаплицки, Эван. «Прощание с ФРП» . вяз . Проверено 14 июля 2018 г.
- ^ Ван ден Вондер, Сэм; Рено, Тьерри; Ойен, Бьярно; Де Костер, Джоэри; Де Мойтер, Вольфганг (2020), «Борьба с неуклюжим отрядом реактивного программирования: модель актер-реактор», Leibniz International Proceedings in Informatics (LIPIcs) , vol. 166, стр. 19:1–19:29, doi : 10.4230/LIPIcs.ECOOP.2020.19 , ISBN. 9783959771542 , S2CID 260445152
- ^ Ван ден Вондер, Сэм; Рено, Тьерри; Де Мойтер, Вольфганг (2022), «Реактивность на уровне топологии в распределенных реактивных программах: реактивное управление знакомством с использованием стад», The Art, Science и Engineering of Programming , vol. 6, стр. 14:1–14:36, arXiv : 2202.09228 , doi : 10.22152/programming-journal.org/2022/6/14 , S2CID 246979565
- ^ «РеактивИкс» . ReactiveX.io . Проверено 3 июля 2022 г.