【问题标题】:How does Reactive's Monad instance handle simultaneous events?Reactive 的 Monad 实例如何处理同时发生的事件?
【发布时间】:2019-11-11 15:11:47
【问题描述】:

在 Conal Elliot 的 Push-Pull Functional Reactive Programming 中,Reactives 在第 7.1.3 节中被赋予了一个 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" 是否应该被忽略或包含在连接的结果中?

【问题讨论】:

  • 这个问题没有意义——join 本质上是在等待第一个Event a 到达。由于never(大概)永远不会到达,join 永远等待,结果是_|_(底部)。
  • @BobDalgleish (MkEvent (pure (MkReactive "bar" never))) 在零时间触发

标签: haskell frp


【解决方案1】:

这是第 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)

u 的定义中使用的 Monoid 实例是 Futures 的实例,在第 4.5 节中定义,在同时触发的情况下选择左边的实例。既然如此,如果在join 中同时触发,则不会丢弃内部触发。对于您问题中的具体示例,在零时间采样仍应给出"foo"。 (我相信如果不是这样,就会违反单子定律join . fmap return = id

【讨论】:

    猜你喜欢
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2012-11-14
    相关资源
    最近更新 更多