haskell - 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"
忽略或包含在连接的结果中?
解决方案
以下是第 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 节中定义u
的Future
s 实例,在同时触发的情况下选择左边的实例。如此一来,如果在 中同时触发,内部触发不会被丢弃join
。对于您问题中的具体示例,在零时间采样仍应给出"foo"
. join . fmap return = id
(我相信如果不是这种情况,就会违反单子定律)
推荐阅读
- html - 为什么嵌套边距会影响正文标签?
- android - 将类型作为参数传递
- c++ - 将行中的最后一个单词(添加到每个单词作为不同元素的向量中)与键入单词 C++ 进行比较
- javascript - 客户端javascript可以创建太大而无法放入内存的文件下载吗?
- pagination - SPARQL:在不重复查询的情况下获取一页结果和总结果
- javascript - Browserify --standalone 带有 ES6 模块和多个源文件和导出
- themes - 为什么使用 Chrome 深色阅读器扩展时,一个框会阻碍我在 medium.com 上的视图
- python - 面板数据上的 PCA?(Python、PCA、Scikit.learn)
- output - 对话流返回“__system_counters__”上下文输出
- javascript - 错误:对象作为 React 子项无效,道具未在 React Hook 中返回