Jump to content

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

Функциональное реактивное программирование ( 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 как ленивые списки . Это половина, основанная на вытягивании. Половина, основанная на рассылке, используется, когда вводятся события, внешние по отношению к системе. Внешние события передаются потребителям, чтобы они могли узнать о событии в момент его возникновения.

Реализации [ править ]

Реализации существуют для многих языков программирования , в том числе:

ReactiveX , популяризированный благодаря реализации rxjs на JavaScript , является функциональным и реактивным, но отличается от функционального реактивного программирования. [18]

См. также [ править ]

Ссылки [ править ]

  1. ^ Эллиотт, Конал; Худак, Павел. «Функциональная реактивная анимация» . Функциональная реактивная анимация . МКФП '97 . Проверено 14 июля 2018 г.
  2. ^ Нильссон, Хенрик; Кортни, Энтони; Петерсон, Джон (февраль 2011 г.) [2002], «Функциональное реактивное программирование, продолжение», Haskell Workshop (PDF)
  3. ^ Эллиотт, Конал; Худак, Пол (1997), «Функциональная реактивная анимация» , ICFP
  4. ^ Кортни, Энтони; Эллиотт, Конал (февраль 2011 г.) [2001], «Подлинно функциональные пользовательские интерфейсы» , Haskell Workshop , Йельский университет.
  5. ^ Эллиот, Конал (2014), «Денотативный дизайн» (PDF) , LambdaJam , получено 5 мая 2023 г.
  6. ^ Таха, Валид; Ван, Чжанюн; Худак, Пол (2002), «FRP, основанный на событиях», PADL (PDF) , Йельский университет, заархивировано из оригинала (PDF) 28 сентября 2013 г. , получено 23 сентября 2013 г.
  7. ^ Чаплицки, Эван; Чонг, Стивен (2013), «Асинхронное функционально-реактивное программирование для графических интерфейсов» , PLDI , Гарвард
  8. ^ Ван, Чжанюн; Таха, Валид; Худак, Пол (февраль 2011 г.), «FRP в реальном времени», ICFP (PDF) , заархивировано из оригинала (PDF) 28 сентября 2013 г. , получено 23 сентября 2013 г.
  9. ^ Эллиотт, Конал (9 декабря 2008 г.). «Почему классический FRP не подходит для интерактивного поведения» . Архивировано из оригинала 12 октября 2022 г.
  10. ^ Борнинг, Алан. «Ввод-вывод на чисто функциональных языках» (PDF) . Архивировано (PDF) из оригинала 28 апреля 2022 г.
  11. ^ Карлссон, Магнус; Халлгрен, Томас (1998). «Fudgets - чисто функциональные процессы с приложениями к графическим пользовательским интерфейсам» (PDF) . Архивировано (PDF) из оригинала 15 октября 2022 г.
  12. ^ Перес, Иван; Баренц, Мануэль; Нильссон, Хенрик (июль 2016 г.), «Функциональное реактивное программирование, рефакторинг», Симпозиум Haskell (PDF)
  13. ^ Аце ван дер Плог; Классен, Коэн. «Практический принцип FRP» (PDF) . Архивировано из оригинала (PDF) 1 июля 2015 г. Проверено 24 июля 2015 г.
  14. ^ Чаплицки, Эван (апрель 2012 г.), Elm: Concurrent FRP для функциональных графических интерфейсов пользователя (PDF) (диссертация), Гарвард, заархивировано из оригинала (PDF) 4 июня 2016 г. , получено 17 февраля 2015 г. {{citation}}: CS1 maint: отсутствует местоположение издателя ( ссылка )
  15. ^ Чаплицки, Эван. «Прощание с ФРП» . вяз . Проверено 14 июля 2018 г.
  16. ^ Ван ден Вондер, Сэм; Рено, Тьерри; Ойен, Бьярно; Де Костер, Джоэри; Де Мойтер, Вольфганг (2020), «Борьба с неуклюжим отрядом реактивного программирования: модель актер-реактор», Leibniz International Proceedings in Informatics (LIPIcs) , vol. 166, стр. 19:1–19:29, doi : 10.4230/LIPIcs.ECOOP.2020.19 , ISBN.  9783959771542 , S2CID   260445152
  17. ^ Ван ден Вондер, Сэм; Рено, Тьерри; Де Мойтер, Вольфганг (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
  18. ^ «РеактивИкс» . ReactiveX.io . Проверено 3 июля 2022 г.
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: f9d5a0fa9aff9ab4c0ab5ec35da468f6__1715830620
URL1:https://arc.ask3.ru/arc/aa/f9/f6/f9d5a0fa9aff9ab4c0ab5ec35da468f6.html
Заголовок, (Title) документа по адресу, URL1:
Functional reactive programming - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)