Reactive 的 Monad 实例如何处理同时发生的事件?
How does Reactive's Monad instance handle simultaneous events?
在 Conal Elliot 的 Push-Pull Functional Reactive Programming 中,Reactive
在第 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"
应该被忽略还是包含在连接的结果中?
这是第 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
实例是 Future
s 的实例,在第 4.5 节中定义,在同时触发的情况下选择左边的一个。既然如此,如果join
中有同时触发,则不会丢弃内部触发。对于您问题中的具体示例,零时采样仍应给出 "foo"
。 (我相信 monad 法则 join . fmap return = id
如果不是这样的话就会被违反)
在 Conal Elliot 的 Push-Pull Functional Reactive Programming 中,Reactive
在第 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"
应该被忽略还是包含在连接的结果中?
这是第 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
实例是 Future
s 的实例,在第 4.5 节中定义,在同时触发的情况下选择左边的一个。既然如此,如果join
中有同时触发,则不会丢弃内部触发。对于您问题中的具体示例,零时采样仍应给出 "foo"
。 (我相信 monad 法则 join . fmap return = id
如果不是这样的话就会被违反)