我正在用反应香蕉在 Haskell 中写一个音乐播放器。我遇到的一个问题是使用 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是一个偏函数,在真正开始播放之前返回Nothing 。问题是一旦addCmdEvent第一次触发,bPosition仍将保持Nothing值。eSetStart/End基于此计算它们的值。只有这样bPosition 才会更新,这是下次触发addCmdEvent时使用的值。依此类推,可以说,值将始终“减一”。
有一个相关的SO question,但在这种情况下,存在一个“触发”事件,可用于计算行为的新值。使用 fromPoll 可以实现类似的事情吗?