Ответ 1
Я рад, что вы начинаете, сначала спрашивая о спецификации, а не о внедрении. Есть много идей, плавающих вокруг того, что такое FRP. Для меня всегда было две вещи: (а) денотативная и (б) временная непрерывность. Многие люди бросают оба этих свойства и идентифицируют FRP с различными понятиями реализации, все из которых не совпадают с моей точкой зрения. Чтобы уменьшить путаницу, я хотел бы, чтобы термин "функциональное реактивное программирование" заменен более точным и описательным "денотативным программированием непрерывного времени" (DCTP), как предложил Джейк МакАртур в беседа в прошлом году.
Под "денотативным" я подразумеваю основанную на точной, простой, независимой от реализации, композиционной семантике, которая точно определяет значение каждого типа и строительного блока. Затем композиционный характер семантики определяет значение всех правильных комбинаций строительных блоков. Для меня денотативным является сердце и суть функционального программирования, и это то, что позволяет точно и сговорчивым рассуждением и, следовательно, основой для правильности, деривации и оптимизации. Питер Ландин рекомендовал "денотативный" как существенную замену более сложному термину "функционал" и способ отличить глубоко/подлинно функциональное программирование от просто функционально выглядящих обозначений. См. этот комментарий для некоторых котировок Лэндена и справочной статьи.
О непрерывном времени см. сообщение Зачем программировать с непрерывным временем? и мою цитату в ответе AshleyF на этой странице. Я удивлен снова и снова, услышав утверждение о том, что идея непрерывного времени как-то неестественно или невозможно реализовать, учитывая дискретность компьютеров. Эта линия мышления поражает меня как причудливую, особенно при выходе из Haskellers, по нескольким причинам:
- Используя ленивые функциональные языки, мы случайно программируем бесконечные данные на конечных машинах. В результате мы получаем прекрасную модульность, как показано в классической статье Джона Хьюза Почему вопросы функционального программирования.
- Существует много примеров программирования в непрерывном пространстве, например, векторная графика, но также такие вещи, как Pan.
- Мне нравятся мои программы, чтобы отразить, как я думаю о пространстве проблем, а не о машине, которая выполняет программы, и я склонен ожидать, что другие высокоуровневые программисты смогут поделиться этим предпочтением. ( "Язык программирования низкий, когда его программы требуют внимания к нерелевантности". - Алан Перлис)
Я делаю библиотеки для программирования с непрерывным временем с TBAG и ActiveVRML (первая система DCTP/FRP), а затем Fran. Это легко осуществить правильно. Несколько различных подходов описаны в статье Функциональные реализации анимации непрерывного моделирования. Реализация непрерывного времени эффективно (и все еще правильно!) - другое дело, особенно избегая пересчета неизменных значений. (См. Документ Push-pull функциональное реактивное программирование.)
Для соответствующих замечаний см. мой ответ на Разницу между реактивным и функционально-реактивным программированием и Что такое ( функциональное) реактивное программирование? Обновление: более подробно о том, почему требуется постоянное время, см. эти примечания. Обновление: см. Также, мой разговор о 2015 Суть и происхождение FRP (и связанные с ним переговоры).
Удачи в вашем исследовании, и, пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы. Моя контактная информация находится на моей домашней странице.