У нас есть система, которая умеет моделировать себя относительно исходного состояния и времени.
Осталось понять, как она меняется? Для этого нужно ввести новый тип Event.
Event — это список состоящий из пар (T, a). То есть: Event -> [(T, a)]. T это действительное число. Время должно возрастать слева направо.
Я вчера оговорился, когда сказал, что Behavior a — это что-то вроде Observable, на самом деле именно Event a — это почти что Observable.
А у меня в голове сидели Signal из Elm. В общем, зря вас запутал.
Event — это тот же стрим данных. Есть два отличия: у них нет конца, два события могут случиться в одно и то же время. Время непрерывно.
Дальше мы можем определить функцию: switcher :: Behavior a -> Event (Behavior a) -> Behavior a.
Напомню, что мы думаем о программе, как о Behavior UI. То есть функции от времени, которая возвращает UI.
Теперь предеположим у нас есть Event UserInteraction.
Это поток событий, которые генерирует пользователь. Клики, скролл, любые взаимодействия.
Дальше, предположим у нас есть функция, которая умеет конвертировать Event UserIntercation -> Event (Behvaior UI).
Назовем ее foldp. Если вы понимаете о чем я. ;-)
Тогда программа: Program :: Behavior UI -> Event (Behavior UI) -> Behavior UI.
Вот мы и научились реагировать на внешние сигналы. Наша программа зависит от времени и действий пользователя.
Те, кто знаком с Elm должны узнать похожие вещи.
Собственно, вопрос — зачем вам это все знать? Дело в том, что отсюда растут ноги и Elm и Redux.
Само по себе DCTP не очень практично, это описано в работе создателя Elm (продублирую ссылку). seas.harvard.edu/sites/default/…
Если что, ее легко читать, не пугайтесь формата PDF.
Но идеи, которое оно порадило, такие как Concurrent FRP вполне применимы в реальном мире.
Если кратко, то основная проблема DCTP – компьютеры дискретные, проблемы с конкуррентностью вычислений и сложность реализации.
Но по выразительности, это, наверное, самая мощная формулировка FRP. Так что знать ее интересно.
Есть 1 пример реализации Original FRP на JS: Flapjax. flapjax-lang.org
А вот репозиторий со сравнениями разных библиотек с разными типами FRP. github.com/gelisam/frp-zoo
В общем, эксперимент мне кажется прошел не очень удачно. Но может вас заинтересовало и вы займетесь самостоятельным изучением.
Вот еще 1 видео про FRP, может быть оно покажется чуть проще. begriffs.com/posts/2016-07-…