为连续可测量的现象创建行为

2024-06-23

我想创建一个Behavior t a从一个IO a,其预期语义是每次行为发生时都会运行 IO 操作sampled:

{- language FlexibleContexts #-}
import Reflex.Dom
import Control.Monad.Trans

onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)

我希望我可以通过执行来做到这一点measurement in a pull:

onDemand measure = return $ pull (liftIO measure)

然而,由此产生的Behavior初始后永远不会改变measurement.

我能想到的解决方法是创建一个虚拟对象Behavior改变“足够频繁”,然后创建一个虚假的依赖关系:

import Data.Time.Clock as Time

hold_ :: (MonadHold t m, Reflex t) => Event t a -> m (Behavior t ())
hold_ = hold () . (() <$)

onDemand :: (MonadWidget t m, MonadIO (PullM t)) => IO a -> m (Behavior t a)
onDemand measure = do
    now <- liftIO Time.getCurrentTime
    tick <- hold_ =<< tickLossy (1/1200) now
    return $ pull $ do
        _ <- sample tick
        liftIO measure

然后这将按预期工作;但是由于Behavior无论如何,只能按需采样,这不是必要的。

创建一个的正确方法是什么Behavior对于连续的、随时可观察的现象?


这样做在Spider看起来不可能。Internal提前推理。

In the Spider实施Reflex,其中一种可能的Behavior https://hackage.haskell.org/package/reflex/docs/Reflex-Spider-Internal.html#t:Behaviors是拉取值。

data Behavior a
   = BehaviorHold !(Hold a)
   | BehaviorConst !a
   | BehaviorPull !(Pull a)

A Pull https://hackage.haskell.org/package/reflex/docs/Reflex-Spider-Internal.html#t:Pulled value 包括如何在需要时计算该值,pullCompute,以及一个缓存值以避免不必要的重新计算,pullValue.

data Pull a
   = Pull { pullValue :: !(IORef (Maybe (PullSubscribed a)))
          , pullCompute :: !(BehaviorM a)
          }

忽略了恶劣的环境BehaviorM https://hackage.haskell.org/package/reflex/docs/Reflex-Spider-Internal.html#t:BehaviorM, liftIO举起一个IO计算的明显方式,它运行时BehaviorM需要采样。在里面Pull,您的行为会被观察一次,但不会再次被观察,因为缓存的值并未失效。

缓存的值PullSubscribed a https://hackage.haskell.org/package/reflex/docs/Reflex-Spider-Internal.html#t:PullSubscribed由值组成a,如果该值无效则需要无效的其他值的列表,以及一些无聊的内存管理内容。

data PullSubscribed a
   = PullSubscribed { pullSubscribedValue :: !a
                    , pullSubscribedInvalidators :: !(IORef [Weak Invalidator])
                    -- ... boring memory stuff
                    }

An Invalidator https://hackage.haskell.org/package/reflex/docs/Reflex-Spider-Internal.html#t:Invalidator是一个量化的Pull这足以获取内存引用以递归地读取无效器以使其无效并将缓存的值写入Nothing.

为了不断地拉动,我们希望能够不断地使我们自己的BehaviorM。执行时,环境传递给BehaviorM有一个自己的失效器的副本,由依赖项使用BehaviorM当它们本身失效时使其失效。

从内部实现来看readBehaviorTracked https://hackage.haskell.org/package/reflex-0.4.0/docs/src/Reflex-Spider-Internal.html#readBehaviorTracked%5D似乎没有办法让行为自己的失效器(wi) 可能会出现在采样时失效的订阅者列表中 (invsRef).

    a <- liftIO $ runReaderT (unBehaviorM $ pullCompute p) $ Just (wi, parentsRef)
    invsRef <- liftIO . newIORef . maybeToList =<< askInvalidator
    -- ...
    let subscribed = PullSubscribed
          { pullSubscribedValue = a
          , pullSubscribedInvalidators = invsRef
          -- ...
          }

在内部结构之外,如果确实存在一种方法来不断地采样Behavior这将涉及MonadFix (PullM t)实例或通过修复相互递归pull https://hackage.haskell.org/package/reflex-0.4.0/docs/Reflex-Class.html#v:pull and sample https://hackage.haskell.org/package/reflex-0.4.0/docs/Reflex-Class.html#v:sample:

onDemand :: (Reflex t, MonadIO (PullM t)) => IO a -> Behavior t a
onDemand read = b
    where
        b = pull go
        go = do
             sample b
             liftIO read

我没有Reflex尝试这个的环境,但我认为结果不会很好。

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

为连续可测量的现象创建行为 的相关文章

  • 为什么以下内容会并行运行而不是顺序运行?

    给定以下函数evalPair parPair and deepSeq分别 evalPair Strategy a gt Strategy b gt Strategy a b evalPair sa sb a b do a lt sa a b
  • 没有由文字“1”产生的 Num String 实例

    main do putStrLn myLast 1 2 3 4 myLast a gt a myLast x x myLast xs myLast xs 当我尝试运行此代码时 我收到此消息 没有由文字 1 产生的 Num String 实例
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常
  • Haskell - 翻转具有两个参数的类型类的参数

    我有一个多参数类型类 它提供了一个可以交换其参数的函数 class Swappable a b where swappable a gt b gt Bool So if a and b form Swappable a b then b a
  • Haskell 中的所有图形和 Web 库是如何实现的?

    我才开始学习Haskell 我读到它是一种纯函数式语言 其中的所有内容都是不可变的 因此 输入输出 写入和读取数据库之类的事情会导致状态的可变性 我知道 Haskell 中有一种叫做 monad 的东西 它允许在 Haskell 中使用命令
  • 作为应用函子(Haskell / LYAH)

    第11章向你学习 Haskell引入以下定义 instance Applicative gt r where pure x gt x f lt gt g x gt f x g x 在这里 作者进行了一些不寻常的挥手 的实例实现有点神秘 所以
  • 不明白这个 haskell 代码中的内容

    我有一些 Haskell 代码 我正在尝试完成它 但我不明白其中发生了什么 type Bag a a gt Int emptyB Bag a emptyB e gt 0 countB Eq a gt Bag a gt a gt Int co
  • 如何在 GHCJS 程序中定期执行操作?

    应该有人使用setInterval通过Javascript 或者使用一些更惯用的基于线程的解决方案 Using setInterval posed 一些挑战 https stackoverflow com questions 3357661
  • ~/.cabal/config 中的“共享”是什么意思?

    我想 共享 会让cabal install更快 对吧 共享的默认值为 False 我们应该使用 True 还是 False 来共享 thanks 这意味着 还构建动态链接 又名共享 版本的库 这些版本与cabal install cabal
  • 加快 GHC 中的编译速度

    除了 O0 这可以加快编译时间吗 如果生成的程序未被优化也没关系 实际上我只想经常快速地对大型 haskell 包进行类型检查 Flag fno code极大地加快了编译速度 但无法使用它 因为该程序使用了 TemplateHaskell
  • 如何从有向无环图导出FRP?

    我目前正在研究我的下一个项目 目前处于预规划阶段 因此这个问题只是为了了解现有技术的概述 Setup 我有一个具有多个输入和输出的有向无环图 DAG 现在考虑人工神经网络 处理这种结构的常见方法是在每个 时间 步骤上处理整个网络 我相信这是
  • enumFromTo 如何工作?

    我无法将号码添加到Char 以下内容将无法编译 a 1 但是 a z 成功创建一个字符串 其中每个字符值都会递增 有没有一个特殊的函数可以增加Char 我知道我能做到chr ord c 1 如何 a z 或底层enumFromTo函数增加结
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh
  • Haskell 中的 Monad 和 Purity

    我的问题是 Haskell 中的 monad 是否真正保持了 Haskell 的纯度 如果是的话 又是如何保持的 我经常读到副作用是如何不纯粹的 但有用的程序 例如 I O 需要副作用 下一句指出 Haskell 对此的解决方案是 mona
  • 数据记录的类约束

    我有一个data type data BuildException a KillBuild JobID a Stage FailBuild JobID a Stage CancelBuild JobID a Stage StopBuild
  • 我必须实现 Applicative 和 Functor 来实现 Monad

    我正在尝试实现一个 Monad 实例 作为一个更简单的示例 假设如下 data Maybee a Notheeng Juust a instance Monad Maybee where return x Juust x Notheeng
  • Haskell 乘加运算的数学性能

    我正在用 Haskell 编写一个游戏 我当前在 UI 上的传递涉及大量几何图形的程序生成 我目前专注于识别一项特定操作的性能 C ish 伪代码 Vec4f multiplier addend Vec4f vecList for int
  • ghci 中严格求和/严格折叠导致内存爆炸

    正如中提到的为什么 sum takeWhile 以下是not炸毁记忆ghci https stackoverflow com questions 14298930 why does sum takewhile 10000000 1 use
  • Haskell 中有“对象平等”的感觉吗?

    如果我在 Haskell 中有一个单链表 data LL a Empty Node a LL a deriving Show Eq 我可以轻松实现在末尾和开头插入的方法 但是在特定元素之后或之前插入又如何呢 如果我有一个LL of Inte
  • 如何查找列表中元素的索引?

    给定列表中的一个元素 我可以使用哪个函数来查找其索引 例如 我想在列表中找到 3 的索引 1 2 3 4 Haskell 中有哪个函数可以用于此目的 看看这里 在 Haskell 中查找列表中元素的索引 https stackoverflo

随机推荐

  • Javascript 将相同的类添加到 Div,而不需要为每个 Div 进行计算

    我显示了 2 张优惠券 它们都有 new coupon 而实际上一张应该说 new coupon 一张应该说 old coupon 它似乎为页面上具有该类的每个元素应用相同的类 而不是计算每个元素应该属于哪个类 jQuery documen
  • 如何在 Silverlight 4 中释放 COM 对象

    当将 COM Interop 与 Office 通常是 Excel 一起使用时 我总是小心地确保我调用Marshal ReleaseComObject在每个引用上 以避免 Excel 不退出的问题如本知识库文章中所述 http suppor
  • 错误:未指定默认引擎且未提供扩展名

    我正在使用 node js 和引擎设置 http 服务器 但是 我不断遇到一些问题 我对如何解决这个问题知之甚少 我希望能得到一些帮助来解决这个问题 Error No default engine was specified and no
  • 正确地将 for 循环转换为并行循环

    我这里有这个数据集 例如 学生在几年内多次参加考试 要么通过 要么失败 我有兴趣研究上一次测试对下一次测试的影响 id sample int 10000 100000 replace TRUE res c 1 0 results sampl
  • 过滤长时间序列Python的最有效方法

    我有一个很大的时间序列 比如 1e10 它是记录神经活动 即电压 的结果 在进行进一步分析之前 我想对 300 Hz 到 7000 Hz 之间的数据进行带通滤波 下面 我发布了我设计的巴特沃斯滤波器的代码 如何使这个过滤器更快 运行时间太长
  • 如何将缓冲区重命名为类似的名称

    这种情况经常发生在我身上 我正在使用多个M x shell贝壳同时 要打开下一个 shell 我必须将第一个 shell 重命名为rename buffer 然而 emacs 只是提示新的缓冲区名称 而不允许我重用现有的缓冲区名称来构建相关
  • 将 HTTP GET 请求中的 JSON 数据从 JAVA 代码发送到 REST API

    我正在向我的 API 成功发出以下curl 请求 curl v X GET H Content Type application json d query some text mode 0 http host domain abc com
  • 将 winform 树视图转换为 wpf 树视图

    我已经构建了一个在 winforms 中生成树视图的函数 它包括具有递归的子文件夹和文件 现在我想将其转换为 wpf 我不知道如何处理课程 我知道我必须制作自己的自定义类 treenode 它有一个属性 parent 类似于 winform
  • JASIG CAS:单点注销不起作用

    我的单点登录工作得很好 但单点退出不起作用 场景是这样的 打开 webapp1 并重定向到 CAS 登录页面 输入详细信息并登录 打开也使用 CAS 的 webapp2 自动登录 因为用户已经登录 退出 webapp1 尝试打开 webap
  • 已弃用在 c 中从字符串常量到“char*”的转换[重复]

    这个问题在这里已经有答案了 我正在使用字符串 每当我执行以下程序时 我都会收到错误已弃用从字符串常量到 char 的转换 in c 在线上char p hello 我究竟做错了什么 这个错误是什么意思 我该如何纠正它 我的代码是 inclu
  • CallKit 错误 com.apple.CallKit.error.requesttransaction 错误 2

    我尝试过很多使用 CallKit 在 ios swift 上发起拨出呼叫的示例 我已经在功能中启用了 VOIP 在所有情况下 它都会失败 callController request transaction error in if let
  • bash 中的 SIGINT 和进程替换

    我发现如果我有类似的东西 usr bin env bash function abort politely echo Aborting politely sleep 5 touch stop trap abort politely SIGI
  • 验证是否存在唯一字符串的组合

    class Details String name String age String email String location 1 如果有详细信息列表 如下所示List
  • SQL - 添加从条件开始的顺序计数器列,具有分组依据和非递增 ID

    这个问题的棘手版本 SQL 添加从条件开始的顺序计数器列 https stackoverflow com questions 57897292 sql add sequential counter column starting at co
  • 在wpf中快速生成ViewModel属性?

    看完之后本文 http msdn microsoft com en us magazine dd419663 aspx a 在我的中有以下代码PersonViewModel class public Jurisdiction Country
  • Jenkins sh 标签:“sh”的参数必须明确命名

    我知道Jenkins Pipeline sh 显示名称 标签 https stackoverflow com questions 39414921 jenkins pipeline sh display name label 5467642
  • JavaScript:删除共享相同属性值的对象的重复项

    我有一系列对象 我想根据特定的情况来修剪它们key value一对 我想创建一个数组 其中每个特定对象仅包含一个对象key value一对 将重复项中的哪个对象复制到新数组并不一定重要 例如 我想根据price的财产arrayWithDup
  • 获取用于启动 Docker 容器的命令

    我正在运行一个 Docker 容器 我想创建另一个与之类似的容器 如何找出启动容器时使用的命令 有docker inspect 但我必须一一检查并查看每个配置选项 编辑 我想获取用于启动容器的完整命令 包括环境变量 链接 卷等 例如 doc
  • 如何在 WordPress 中创建“通用”自定义字段?

    wordpress 版本 3 4 好的 这就是我正在尝试做的事情 创建一个名为 自定义字段 的页面 用户实际上永远不会看到该页面 只需让客户添加自定义字段即可 他经常需要每周 每月更改这些自定义字段 我需要将这些自定义字段显示在页眉 页脚或
  • 为连续可测量的现象创建行为

    我想创建一个Behavior t a从一个IO a 其预期语义是每次行为发生时都会运行 IO 操作sampled language FlexibleContexts import Reflex Dom import Control Mona