gpt4 book ai didi

haskell - Reactive-banana:来自 fromPoll 的最新值

转载 作者:行者123 更新时间:2023-12-02 10:13:01 25 4
gpt4 key购买 nike

我正在 Haskell 中使用reactive-banana 编写一个音乐播放器。我遇到的一个问题是使用 fromPoll 获取最新值。我希望用户能够在播放时选择性地选择轨道的一部分。我的代码看起来像这样:

makePlayNetworkDescr :: Player a => AddHandler Command -> a -> NetworkDescription t ()
makePlayNetworkDescr addCmdEvent player = do
bPosition <- fromPoll (getPosition player)
eCmds <- fromAddHandler addCmdEvent

let eSetStart = filterE (isJust) $ bPosition <@ filterE (==SetStart) eCmds
eSetEnd = filterE (isJust) $ bPosition <@ filterE (==SetEnd) eCmds
eClearRange = filterE (==ClearRange) eCmds

bStart = accumB Nothing ((const <$> eSetStart) `union` (const Nothing <$ eClearRange))
bEnd = accumB Nothing ((const <$> eSetEnd) `union` (const Nothing <$ eClearRange))

上面,getPosition是一个部分函数,​​在播放实际开始之前什么都没有返回。问题是,一旦 addCmdEvent 第一次触发,bPosition 仍将保持 Nothing 值。 eSetStart/End据此计算它们的值。只有这样,bPosition 才会更新,并且这是下次 addCmdEvent 触发时使用的值。依此类推,可以这么说,该值总是“相差一”。

有一个相关的SO question ,但在这种情况下,存在一个“触发”事件,可用于计算行为的新值。 fromPoll 可以实现类似的功能吗?

最佳答案

从reactive-banana-0.5和0.6开始,fromPoll每当外部事件触发事件网络时,函数就会更新行为。您可以使用以下方式将这些更新作为事件访问

eUpdate <- changes bSomeBehavior

但是,请注意,行为表示连续随时间变化的值,不支持“更新事件”的一般概念。 changes函数将尝试返回有用的近似值,但没有正式的保证。

或者,您可以更改外部事件以将玩家位置包含在 addCmdEvent 中。 。在您的情况下,这意味着将更多数据添加到 SetStartSetEnd构造函数。然后,您可以使用

eSetStart = filterJust $ matchSetStart <$> eCmds
where
matchSetStart (SetStart pos) = Just pos
matchSetStart _ = Nothing
<小时/>

这两种解决方案都要求您将最新值作为事件而不是行为来观察。原因是使用 stepper 创建的行为将始终在更新时返回旧值(它们“落后一”),因为这对于递归定义非常有用。

无论如何,根本问题是玩家位置早在 addCmdEvent 之前就已从外部更新。发生了,但问题是这不是事件网络看到的。相反,网络认为 fromPoll 返回的行为与addCmdEvent同时更新。事实上,除非您有权访问负责更新玩家位置的外部事件源,否则这是它唯一能想到的事情。 (如果您有访问权限,则可以使用 fromChanges 函数。)

我意识到fromPoll的这种行为对于您的常见用例来说有些不满意。不过,我尚未决定是否应该在我的库中修复它: fromPoll 之间需要权衡。返回最新值和 changes功能尽力做到最好。如果返回最新值,则 changes其行为就好像它跳过了一次更新(当值在外部更新时)并触发了一个多余的更新(当网络更新值以匹配外部更新时)。如果您对此有什么意见,请告诉我。

<小时/>

请注意,将行为与应用运算符 <*> 组合起来将很好地结合最新的值。

关于haskell - Reactive-banana:来自 fromPoll 的最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10787945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com