Как экземпляр Monad Reactive обрабатывает одновременные события? - PullRequest
4 голосов
/ 30 июня 2019

In Функциональное реактивное программирование Push-Pull от Conal Elliot, Reactive s предоставляется экземпляр Monad в разделе 7.1.3.Что произойдет, если как внутренний, так и внешний реактивный огонь одинаковы для join?

never :: Event a
MkFuture :: Time -> a -> Future a
pure :: a -> Future a -- at time zero
MkReactive :: a -> Event a -> Reactive a
MkEvent :: Future (Reactive a) -> Event a

join (MkReactive (MkReactive "foo" never) (MkEvent (pure (MkReactive "bar" never)))

Следует ли "foo" игнорировать или включить в результат при объединении?

1 Ответ

1 голос
/ 03 июля 2019

Вот (слегка перефразированное) определение join из раздела 7.1.3:

-- urr is the outer Reactive; ur is the inner one.
joinR :: Reactive (Reactive a) -> Reactive a
joinR ((a `Stepper` Ev ur) `Stepper` Ev urr) = a `Stepper` Ev u
    where
    u = ((`switcher` Ev urr) <$> ur) <> (join <$> urr)

Экземпляр Monoid, используемый в определении u, предназначен для Futures, определенный в разделе 4.5, который в случае одновременных выстрелов выбирает левый.В этом случае внутренняя стрельба не отбрасывается, если в join одновременно ведется стрельба.Для конкретного примера в вашем вопросе выборка в нулевое время все равно должна выдать "foo".(Я верю, что закон монады join . fmap return = id был бы нарушен, если бы это было не так)

...