Вот (слегка перефразированное) определение 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
, предназначен для Future
s, определенный в разделе 4.5, который в случае одновременных выстрелов выбирает левый.В этом случае внутренняя стрельба не отбрасывается, если в join
одновременно ведется стрельба.Для конкретного примера в вашем вопросе выборка в нулевое время все равно должна выдать "foo"
.(Я верю, что закон монады join . fmap return = id
был бы нарушен, если бы это было не так)