我正在用反應香蕉在Haskell寫一個音樂播放器。我遇到的一個問題是使用fromPoll獲取最新值。我想要讓用戶在播放時選擇部分曲目。我的代碼看起來是這樣的:活性香蕉:來自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第一次火災,b地位仍然會保持一個沒有值。 eSetStart/End根據此計算它們的值。只有這樣bPosition得到更新,並且這是下次將用於該值的值,其中addCmdEvent火災。等等,價值永遠是「一個」,可以這麼說。
有一個相關SO question,但在這種情況下,存在一個「觸發」事件,可用於計算行爲的新值。 fromPoll有沒有這樣的可能?
當你完成後,你應該把結果放在Hackage上。期待從哈斯克爾演奏我的音樂! – amindfv
我打算把它放在Hackage上一次(哈)我完成了。然而,這是一種「搔自己癢」的音樂播放器,以幫助轉錄音樂,所以我不確定這對其他人有多有趣。 – oggy