反应式香蕉节流事件

2024-03-03

我想在reactive-banana 中实现某种类型的事件限制。它应该工作,以便如果距最后一个事件通过的时间少于 delta 秒,则不会让事件通过。如果不让其通过,则会存储该事件,并在距离上次触发事件 delta 秒后触发。

下面是一个为时间戳数字列表实现此功能的程序。是否可以将其翻译为reactive-banana?

另外,在reactive-banana中,如何在其他事件到来后x秒触发一个事件?



module Main where

import Data.List

-- 1 second throtling
-- logic is to never output a value before 1 second has passed since last value was outputed.

main :: IO()
main = print $ test [ (0.0, 1.0), (1.1, 2.0), (1.5,3.0), (1.7,4.0),  (2.2, 5.0)  ]
--should output  [ (0.0, 1.0), (1.1, 2.0), (2.1,4.0), (3.1, 5.0) ]

test :: [(Double,Double)] -> [(Double,Double)]
test list = g v (concat xs)
       where
               (v, xs) = mapAccumL f (-50,Nothing) list
               g (t, Just x) ys = ys ++ [ (t+1,x) ]
               g _ ys  = ys
               f (lasttime, Just holdvalue) (t,x) = if t > (lasttime+1) then
                               if t > (lasttime + 2) then
                                       ( (t, Nothing), [ (lasttime+1,holdvalue), (t,x)] )
                               else ( (lasttime+1, Just x) , [ (lasttime+1,holdvalue) ] )
                       else        
                               ( (lasttime, Just x), [] )
               f (lasttime, Nothing) (t,x) = if t > (lasttime+1) then
                        ( (t,Nothing) , [ (t, x ) ] ) 
                        else ( (lasttime, Just x), [] )
  

从reactive-banana-0.6开始,绝对可以实现你想要的功能,但是有点复杂。

基本上,您可以使用像 wxHaskell 这样的外部框架来创建一个计时器,然后您可以使用它来安排事件。这Wave.hs https://github.com/HeinrichApfelmus/reactive-banana/blob/master/reactive-banana-wx/src/Wave.hs示例演示了如何做到这一点。

目前,我选择不在反应式香蕉库本身中包含时间概念。原因很简单,不同的外部框架具有不同分辨率或质量的计时器,没有一种尺寸适合所有情况。

我确实打算向库本身添加处理时间和计时器的通用辅助函数,但我仍然需要找到一种好方法,使其在不同计时器上通用,并找出我可以提供哪些保证。

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

反应式香蕉节流事件 的相关文章

  • macOS 上的堆栈构建

    我是新来的haskell 我有最简单的程序 usr bin env stack stack resolver lts 13 7 script module Main where import Lib main IO main putStrL
  • 作用域类型变量需要显式 foralls。为什么?

    如果你想使用 GHC词法作用域类型变量 http www haskell org ghc docs 7 6 2 html users guide other type extensions html scoped type variable
  • Spring Webflux 抛出“block()/blockFirst()/blockLast() 正在阻塞,线程reactor-http-nio-2 不支持”

    我在 Spring Webflux 中执行阻塞操作时遇到一个小问题 我检索文章文档列表 并从文章文档列表中 我想更新另一个对象 当我执行下面的代码时 有时它会起作用 有时会抛出 block blockFirst blockLast 正在阻塞
  • Haskell / SmallCheck:如何控制“Depth”参数?

    我有一个简单的数据结构可以在smallcheck 中测试 LANGUAGE FlexibleInstances MultiParamTypeClasses LANGUAGE DeriveGeneric import Test Tasty i
  • 更新 mtl 后找不到模块“Control.Monad.State”

    我想用Control Monad Except模块 但结果发现我有一个过时的 mtl 包 它导致了导入错误 我有一个过时的模块Control Monad Error 所以我做了 sudo cabal install mtl 并且安装了2 2
  • 你在实际项目中使用过Quickcheck吗[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 快速检查 http www cs chalmers se rjmh QuickCheck 及其变体 即使有一个Java https bitbuc
  • 哪个 Haskell 计算机图形几何库?

    我想用 Haskell 做一些计算机图形学实验 这将包括进行一些几何计算并最终编写光线追踪器 我应该选择哪个库来轻松处理向量 矩阵及其相关操作 Hackage 上很少有包括像这样好看的vect http hackage haskell or
  • 如何在自定义 rxcpp 运算符上调用 on_error

    我创建了一个简单的 rx 运算符 它将字符串流转换为 json 流 并且工作正常 但是 我希望能够引发自定义异常 并且我不知道如何调用on error认购方式 操作员称为convertStringToJson可以在此处找到工作示例 http
  • 如何为流数据创建 Flux/Publisher

    我正在使用轮询方法定期获取数据 新数据可能随时到达 我想向我的客户公开一个反应式接口 因此 我想创建一个发布者 Flux 它会在新数据可用时发布新数据并通知订阅者 我怎么做 我看到的所有 Flux 示例都是针对数据已知 可用的情况 实际上
  • 了解 rxjs 中的背压 - 仅缓存 5 个等待上传的图像

    我正在开发一个节点项目 需要提交数千张图像进行处理 在将这些图像上传到处理服务器之前 需要调整它们的大小 因此我有一些类似的内容 imageList map image gt loadAndResizeImage merge 3 map i
  • 显示未定义的实例

    可以采取任何措施来为未定义的值定义 Show 实例吗 也许存在一些 GHC 扩展 我想要这样的东西 gt print 1 undefined 1 undefined 根据Haskell 2010 报告 第 9 章 http www hask
  • 用parsec解析递归数据

    import Data Attoparsec Text Lazy import Data Text Lazy Internal Text import Data Text Lazy pack data List a Nil Cons a L
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 为什么 Parsec 的 sepBy 停止并且不解析所有元素?

    我正在尝试解析一些逗号分隔的字符串 该字符串可能包含也可能不包含具有图像尺寸的字符串 例如 hello world 300x300 good bye world 我写了下面的小程序 import Text Parsec import qua
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist

随机推荐