首页 > 解决方案 > Reactive 的 Monad 实例如何处理同时发生的事件?

问题描述

在Conal Elliot的Push-Pull Functional Reactive Programming中,s在第 7.1.3 节Reactive中给出了一个实例。Monad如果内部和外部反应同时触发会发生什么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"忽略或包含在连接的结果中?

标签: haskellfrp

解决方案


以下是第 7.1.3 节中的(稍作解释)join定义:

-- 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实例是第 4.5 节中定义uFutures 实例,在同时触发的情况下选择左边的实例。如此一来,如果在 中同时触发,内部触发不会被丢弃join。对于您问题中的具体示例,在零时间采样仍应给出"foo". join . fmap return = id(我相信如果不是这种情况,就会违反单子定律)


推荐阅读