反应式香蕉:触发包含行为的最新值的事件

2023-12-22

假设我有一个活动trigger当被解雇时我想做两件事。首先,我希望它更新一些的值behavior。其次,如果满足其他条件,我希望它触发另一个事件send_offupdated行为的价值。以代码形式表达,假设我有

trigger :: Event b
trigger = ...

updateFromTrigger :: b -> (a -> a)
updateFromTrigger = ...

conditionFromTrigger :: b -> Bool
conditionFromTrigger = ...

behavior :: Behavior a
behavior = accumB initial_value (updateFromTrigger <$> trigger)

send_off :: Event a
send_off = ?????? (filterE conditionFromTrigger trigger)

那么问题是:我该在 ?????? 中放入什么?以便send_off发送最新值behavior,我的意思是包含更新的值trigger这只是应用于它。

不幸的是,如果我理解正确的话,Behavior 的语义是这样的,更新后的值不能立即提供给我,所以我在这里唯一的选择本质上是复制工作并重新计算行为的更新值,以便我可以立即使用它在另一个事件中,即填写 ??????与类似的东西

send_off =
    flip updateFromTrigger
    <$>
    behavior
    <@>
    filterE conditionFromTrigger trigger

现在,我有一种感觉can通过使用离散而不是行为,使行为中的更新信息立即可供我使用,但这实际上相当于给我一个与原始事件同时触发并具有更新值的事件,除非我错过了一些反应式香蕉并没有给我一种只有当另外两个事件同时触发时才触发事件的方法;也就是说,它提供事件的并集,但不提供交集。

所以我有两个问题。首先,我对这种情况的理解是否正确,特别是我的结论是否正确:我的上述解决方案是解决该问题的唯一方法?其次,纯粹出于好奇,开发者对于如何处理事件的交叉点有什么想法或计划吗?


很好的问题!

不幸的是,我认为有根本问题这里没有简单的解决方案。问题如下:您想要最近的累计值,但是trigger可能含有同时地正在发生的事件(仍然是有序的)。然后,

哪个同时累加器更新将是最新的?

要点是更新在它们所属的事件流中排序,但与其他事件流无关。这里使用的FRP语义不再知道哪个同时更新到behavior对应于同时进行的send_off事件。特别是,这表明您建议的实施send_off可能是不正确的;当它不起作用时trigger包含同时发生的事件,因为行为可能会更新多次,但您只重新计算更新一次。

考虑到这一点,我可以想到解决该问题的几种方法:

  1. Use mapAccum http://hackage.haskell.org/packages/archive/reactive-banana/0.4.3.0/doc/html/Reactive-Banana-Model.html#v%3amapAccum使用新更新的累加器值注释每个触发事件。

    (trigger', behavior) = mapAccum initial_value $ f <$> trigger
        where
        f x acc = (x, updateFromTrigger acc)
    
    send_off = fmap snd . filterE (conditionFromTrigger . fst) $ trigger'
    

    我认为这个解决方案在模块化方面有点缺乏,但根据上面的讨论,这可能很难避免。

  2. 重新塑造一切Discrete.

    我在这里没有任何具体的建议,但可能是你的send_off事件感觉更像是值的更新,而不是真正的事件。在这种情况下,可能值得将一切都考虑在内Discrete, whose Applicative当同时发生事件时,实例会做“正确的事情”。

    本着类似的精神,我经常使用changes . accumD代替accumE因为感觉更自然。

  3. 下一个版本的reactive-banana(> 0.4.3)可能会包含以下功能

    collect :: Event a   -> Event [a]
    spread  :: Event [a] -> Event a
    

    分别具体化。反映同时发生的事件。我需要他们来优化Discrete无论如何都要输入,但它们可能对于当前问题也很有用。

    特别是,它们将允许您这样定义事件的交集:

    intersect :: Event a -> Event b -> Event (a,b)
    intersect e1 e2
            = spread . fmap f . collect
            $ (Left <$> e1) `union` (Right <$> e2)
        where
        f xs = zipWith (\(Left x) (Right y) -> (x,y)) left right
          where (left, right) = span isLeft xs 
    

    然而,根据上面的讨论,这个函数可能没有你想象的那么有用。特别是,它不是唯一的,有很多变体。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

反应式香蕉:触发包含行为的最新值的事件 的相关文章

随机推荐

  • 使用 uploadify 时出现 HTTP 错误 302

    我使用 uploadify 将文件上传到我的网站 它与一家托管公司合作 并且不与其他公司 sweb ru 合作 错误是 HTTP 错误 302 有谁知道如何解决这个问题 谢谢 对于任何在 Uploadify 和 PHP 框架 例如 Code
  • Eclipse 命令行插件

    我需要一个在 Linux 下运行 shell 脚本的 Eclipse 插件 我有一个漂亮的 Rsync 脚本 我想要 Eclipse 中的一个按钮来激活它 最好的解决方案是 当我保存东西时 Rsync shell 脚本也被激活 所以也许我可
  • Linq2Sql - 使用本地集合作为子查询的一部分 - “不支持使用本地集合的查询”

    Ok 上次我发布此内容 上周 时 我没有正确描述问题 我创建了这个问题的快速示例 如果您将其用作基本查询的一部分 则查询本地集合可以正常工作 我发现的问题是将它与子查询的一部分一起使用 例如 如果不给你们提供数据库图或代码图 这是相当难以描
  • Jackson ObjectMapper 设置 JsonFormat.Shape.ARRAY 不带注释

    我需要使用两个 jackson 2 对象映射器 两个映射器都使用同一组类 首先 我需要使用标准序列化 在第二个中 我想对所有类使用 ARRAY 形状类型 请参阅https fasterxml github io jackson annota
  • JAX-RS 和未知查询参数

    我有一个调用 RESTEasy JAX RS Java 服务器的 Java 客户端 我的某些用户可能拥有比服务器版本更新的客户端版本 该客户端可能会调用服务器上包含服务器不知道的查询参数的资源 是否可以在服务器端检测到这一点并返回错误 我知
  • Android Studio 不显示颜色

    我使用 android studio 进行图层主题 使用 android studio 进行主题化很容易 因为我可以在左侧看到 studio 本身的颜色 检查我所指的屏幕截图 但在 CM13 模板中我不知道有什么问题它不显示颜色 我是 an
  • 使用 Visual Basic 函数在 Excel 中的正则表达式匹配和替换范围

    我正在寻找在 Excel 2010 Visual Basic 7 中创建一个名为 CODEMATCH 的用户定义函数 它将 1 Take a range as an input 2 Preserve the structure of the
  • 按年份获取 Jekyll 帖子 [重复]

    这个问题在这里已经有答案了 如果您愿意的话 我正在对我网站上的所有帖子进行 存档 我想收集一年中的所有帖子 然而 这段代码工作正常 我希望它生成 h2 2014 h2 需要的时候 基本上 如果年份是 2014 年 则渲染 h2 2014 h
  • 如何创建带有文件孔的文件?

    文件洞是文件中的空白空间 但它不占用任何磁盘空间并包含空字节 因此 文件大小大于其在磁盘上的实际大小 但是 我不知道如何创建一个带有文件孔的文件进行试验 Use the dd命令与seek范围 dd if dev urandom bs 40
  • 清除 iframe 内容(包括它的 JS 全局范围)

    我正在动态创建一个 iframe 如下所示 let code
  • 尝试构建基本的 python 扩展示例失败(Windows)

    我在 Win7 x64 计算机上运行 Python 2 6 和 Visual Studio 2008 当我尝试在 python 2 6 源代码分发中找到的 c example nt 中构建基本的 python 扩展示例时 它失败了 pyth
  • 带身份验证的 NSURLSession 的简单示例

    我编写了一个提供一些数据的 REST 服务 它受密码保护 我正在尝试编写一个后台进程来获取数据并将其填充到我在应用程序中的 sqlLite 数据库中 我最初是在没有身份验证的情况下使用以下方法执行此操作的 void callWebServi
  • 在javascript中获取视频第一帧

    如何在 javascript 中获取视频文件的第一帧作为图像 可以使用 HTML 5 视频和画布标签来完成 HTML
  • 为 iPhone 应用程序生成类图

    我知道如何在 Xcode 中为 iPhone 应用程序生成类图 但我正在寻找替代方法来表示它 因为我的应用程序非常大 很难在我的论文报告中放入图表和解释 知道如何以简短的方式表示所有类或应用程序 以便我可以将其放入我的论文报告中 非常感谢
  • 如何在 adobe-brackets 中创建新项目?

    我已经开始使用土坯括号 https github com adobe brackets用于编辑 JavaScript HTML 和 CSS 目前 我在侧栏中打开了 入门 项目 我想创建一个新项目 但文件菜单中没有这样的 新建项目 项 我尝试
  • 离开网页时发出警报

    当我尝试关闭包含未保存更改的 Google 文档选项卡时 这就是我在浏览器 FF 3 5 中看到的内容 您确定要离开吗 从这个页面 您对此有未保存的更改 文档 单击立即取消 然后 拯救 来拯救他们 单击 立即确定 即可 丢弃它们 按 确定
  • 错误:找不到驱动程序 - 将 PDO 与 MS Access 数据库结合使用

    背景 我有一个完全可用的 Microsoft Access DB 我创建了一个数据库连接类和一个包含该类并触发简单 SQL 代码的简单页面 我知道代码是正确的 因为几周前它运行良好 然而 从那时到现在 我安装了 PHP MySQL 设置了
  • Python 导入错误 - 运行单元测试

    为什么项目中的模块出现导入错误 所有包都在项目下 它们都有 init py 并且其他脚本不会给出相同的错误 Python版本是3 6 代码是在Unix环境下编写的 这是我收到的导入错误 我正在尝试在这里进行测试 Ran 1 test in
  • 将对象列表传递给 SQL Server 存储过程并使用 asp.net core 插入记录

    我正在开发 ASP NET 应用程序 我正在使用 ado net 访问 SQL Server 数据库并执行 CRUD 我想一次性插入多条记录 为此 我在数据库中添加了一个自定义类型和一个存储过程 如下所示 CREATE TYPE dbo U
  • 反应式香蕉:触发包含行为的最新值的事件

    假设我有一个活动trigger当被解雇时我想做两件事 首先 我希望它更新一些的值behavior 其次 如果满足其他条件 我希望它触发另一个事件send off与updated行为的价值 以代码形式表达 假设我有 trigger Event