Ответ 1
К сожалению, совместное "событие" и "поведение" в единый "сигнал" не работает так хорошо.
Большинство основанных на сигнатуре FRP-реализаций, которые, как мне известно, создают дополнительный тип, похожий на событие, по строкам
type Event a = Signal (Maybe a)
Итак, понятие событий не исчезает, и нет реального упрощения. На самом деле, я бы сказал, что тип сигнала является семантическим усложнением. Сигналы популярны только потому, что их легче реализовать.
Основной аргумент против сигналов состоит в том, что они не могут представлять непрерывное поведение во времени, поскольку они должны удовлетворять дискретным событиям. В "Конале Эллиоте "Оригинальное видение" , поведение было простым непрерывным временем работы
type Behavior a = Time -> a
-- = function that takes the current time as parameter and returns
-- the corresponding value of type a
Напротив, сигналы всегда всегда дискретизируются и обычно связаны с фиксированным шагом времени. (Можно реализовать как события, так и поведение поверх сигнала переменной времени, но это не является хорошей абстракцией.) Сравните это с потоком событий
type Event a = [(Time,a)]
-- list of pairs of the form (current time, corresponding event value)
где отдельные события не обязательно происходят в регулярных промежутках.
Аргумент различия между поведением и событиями заключается в том, что их API совсем другой. Главное, что у них разные типы продуктов:
(Behavior a , Behavior b) = Behavior (a,b)
(Event a , Event b ) = Event (a :+: b)
В словах: пара поведений совпадает с поведением пар, но пара событий совпадает с событием из любого компонента/канала. Другое дело, что существуют две операции
(<*>) :: Behavior (a -> b) -> Behavior a -> Behavior b
apply :: Behavior (a -> b) -> Event a -> Event b
которые имеют почти тот же тип, но совершенно другую семантику. (Первый обновляет результат при изменении первого аргумента, а второй - нет.)
Подводя итог: сигналы могут использоваться для реализации FRP и ценны для экспериментов с новыми методами реализации, но поведение и события - лучшая абстракция для людей, которые просто хотят использовать FRP.
(Полное раскрытие: я реализовал библиотеку FRP под названием reactive-banana в Haskell.)