🔥

Тред (@thought_sync)


У нас есть система, которая умеет моделировать себя относительно исходного состояния и времени.

Осталось понять, как она меняется? Для этого нужно ввести новый тип 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-…