如何实现递归依赖于自身的反应式香蕉行为?

2024-02-12

我有一个行为,我想根据事件的发生和行为的当前值来更改其值。在下面的示例中,我有两个计数器,它们根据布尔行为是 True 还是 False 进行更新。事实上,这段代码崩溃了<<loop>>例外,但我不确定如何重组它以使其工作或如何解决这个问题。

{-# LANGUAGE ScopedTypeVariables #-}

import Reactive.Banana
import Reactive.Banana.Frameworks

import Control.Arrow
import Control.Concurrent
import Control.Monad
import Control.Monad.Fix

counter :: Bool -> Event t Int -> Behavior t Bool -> (Behavior t Int, Event t (Bool -> Bool))
counter b input active = (result, whenE ((b/=) <$> active) (fmap (const not) input))
    where result = accumB 0 (fmap (+) evt')
          evt' = whenE ((b==) <$> active) input

alternater :: Event t Int -> Behavior t Bool -> (Behavior t (Bool, (Int, Int)), Event t (Bool -> Bool))
alternater input active = ((,) <$> active <*> ((,) <$> fst t1 <*> fst t2), snd t1 `union` snd t2)
    where t1 = counter True input active
          t2 = counter False input active

main :: IO ()
main = do
    (inputHandler, fireInput) <- newAddHandler
    let network :: forall t . Frameworks t => Moment t ()
        network = do
            eInput <- fromAddHandler inputHandler
            let ui :: Behavior t (Bool, (Int, Int)) -> Moment t (Behavior t (Bool, (Int, Int)))
                ui b = do
                    let (behavior, evt) = alternater eInput (fst <$> b)
                    return $ stepper id (fmap (***id) evt) <*> behavior
            output <- changes =<< mfix ui
            reactimate $ putStrLn . show <$> output
    forkIO $ actuate =<< compile network
    forever $ getLine >>= fireInput . read

例外是正确的,您直接根据行为本身定义行为。

alternater .. active = (.. <$> active <*> .. , ..)
ui b = do
    let (behavior, ..) = alternater .. (.. <$> b)
    return $ .. <*> behavior

... mfix ui

此代码表示结果行为的当前值ui将以循环方式依赖于自身。

递归总是需要一点延迟才能被明确定义。最方便的方法是在事件和使用以下命令构建的行为之间使用相互递归stepper or accumB。也可以看看这个答案 https://stackoverflow.com/a/7852344/403805.

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

如何实现递归依赖于自身的反应式香蕉行为? 的相关文章

随机推荐

  • Azure DevOps:跨存储库拉取请求?

    我不确定人们是否通常在同一存储库中维护生产分支和其他开发 开发人员特定分支 但我希望拥有单独的仅生产存储库 现在 在这种情况下 我如何不断更新生产存储库 分支中的代码 如果是同一个存储库 那么我可以跨分支创建拉取请求 并使分支 代码保持最新
  • 如何以编程方式在 sitecore 中设置 Treelist 的值

    我有一个职位描述页面 我正在以编程方式向其添加值 其中一个字段是 Office Locations 数据类型为 Treelist 如何将值添加到树列表以便我可以设置办公位置 Sitecore Treelist以管道分隔形式存储所选项目的 i
  • 使用部署槽部署Azure Functions时如何避免主机重启?

    我将管道配置为对 Azure Functions 进行零停机时间部署 为此 我采取了以下步骤 创建槽 部署到插槽 开始交换预览 完成交换 我对此过程的理解是 所有重新启动都应该仅在预览槽上发生 因此只有 JobHost 应该重新启动 并且这
  • 使用 JPA 和 Hibernate 注册 SQL 函数

    我想知道最好的方法是什么使用 JPA Hibernate 注册自定义 SQL 函数 我是否必须扩展 MysqlInnodb 方言还是有更好的方法 任何人都可以提供代码示例和相关文档的指针吗 您可能会阅读一些文章 告诉您通过扩展 Hibern
  • 使用keras加载模型并为其参数分配新值

    我正在尝试使用 keras 存储模型 然后加载它以重新训练 我的问题是加载模型时如何将学习率设置为新值 这是我的代码 Save a model model Sequential model add Dense 64 kernel initi
  • 绘制自定义组件

    这是两个问题 1 是最重要的paint的成员Component使用代号为 1 的简单 2D 图形游戏的最佳方法是什么 或者我什至不应该尝试它 2 为什么下面的代码会画出我的Component只是立即删除它 我像这样初始化我的组件 prote
  • 实体框架 ORA-00932:不一致的数据类型:“'预期 CLOB 为 CHAR”

    Oracle ManagedDataAccess EntityFramework 6 122 1 0 库用于从 MVC ASP Net 应用程序访问 Oracle 数据库 这是截至 2017 年 11 月 14 日来自 NuGet 的最新库
  • 在C程序中,是否可以将所有全局变量重置为默认值?

    我有一个旧版 C Linux 应用程序需要重用 该应用程序使用了很多全局变量 我想重用该应用程序的主要方法并在循环中调用它 我发现当我在循环中调用 main 方法 重命名为 callableMain 时 应用程序行为不一致 因为先前迭代中设
  • 从 HTML 创建自动化、严格设计的多页 PDF 报告 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有哪些基于 Python 的优秀选项可以从 HTML 创建严格设计的 PDF 报告 我附上了 PDF
  • 将base64图像发布到android中的php服务器

    我正在开发一个模块 用户可以在其中将图像上传到服务器 为此 我必须将所选图像更改为 Base64 转换后 我必须使用 Json POST 方法上传图像 但每次应用程序崩溃并且 Logcat 都会出现此错误 Error converting
  • 如何设置 ReSharper 默认公司和版权?

    我刚刚安装了 Stylecop 4 5RC 和 ReSharper 当我创建一个新类时 我发现我现在是合规的 耶 但我希望该公司是我的公司 而不是 Microsoft 我还有太多事情要做 不必担心更新版权文本 默认情况下如何填写这些
  • Gradle 扩展:对于具有简单值的属性,可以使用普通 Kotlin 类型代替 Property 吗?

    The Gradle 文档用于惰性配置 https docs gradle org current userguide lazy configuration html指出在扩展 DSL 类中 诸如var someProperty defau
  • 无法在android中连接websocket和wss

    我正在尝试使用 org java websocket client WebSocketClient API 在 android 中连接安全 websocket 连接 wss 但无法与 https 连接 然而它与 ws 这是我的代码 priv
  • 如何旋转 pyplot.table 中的列标题?

    我正在 matplotlib 中创建一个表 但表头是长字符串 表值是只有几位数字的数字 这给我留下了两个不好的选择 要么我的表格比必要的宽得多 要么我的标题重叠 为了解决这个问题 我想旋转表格标题 可能最多 90 度 换句话说 我想做thi
  • 使用存储过程作为业务逻辑层

    我工作的公司目前正在使用存储过程 在 MsSQL 服务器后端 作为其业务逻辑层 实际的业务逻辑 DLL 仅调用 sProcs 并基本上管理 UI 事件 数据绑定等 我认为设置有问题 尽管我不确定如何向同事解释 顺便说一句 该系统有效 我工作
  • Laravel 8 错误类“App\User”未找到

    我的 auth php 文件 providers gt users gt driver gt eloquent model gt App Models User class 用户控制器文件
  • 使用 python 带有自签名证书的 ssl

    我正在尝试使用我的自签名证书在 python 中构建一个简单的服务器 我使用 makecert 创建了 cer pfx pvk 文件 context ssl create default context ssl Purpose CLIENT
  • C++ 中的彩色输出

    有没有办法使用打印彩色输出iostream和Xcode 例如 我希望能够打印Hello World with Hello red World蓝色和 黄色的 我怎样才能做到这一点 您需要终端颜色代码 对于 Linux 如下 您的系统可能有所不
  • 使用 iTextSharp 阅读 PDF 时出现奇怪的字符

    我正在使用 iTextSharp 来阅读 PDF 文件 我尝试使用以下简单的代码阅读第一页中的全文 var pdfReader new PdfReader
  • 如何实现递归依赖于自身的反应式香蕉行为?

    我有一个行为 我想根据事件的发生和行为的当前值来更改其值 在下面的示例中 我有两个计数器 它们根据布尔行为是 True 还是 False 进行更新 事实上 这段代码崩溃了 lt