基于我之前的问题,我逐渐完善了其设置(如何在反应香蕉中创建单子行为):
假设有eKey
,每当按下某个键时就会触发一个事件,该事件b
的类型Buffer
会在 中发生支持的事件时进行适当修改eKey
,最后IO
对某些事件采取行动。这些IO
操作取决于状态b
(为简单起见,假设它们将当前状态打印b
到控制台)。
目前,我有这个选择事件发生的动作:
getKeyAction :: KeyVal -> Maybe (IO Buffer -> IO Buffer)
getKeyAction 65288 = Just . liftM $ backspace
getKeyAction 65293 = Just $ \mb -> do
b <- mb
print $ "PRESSED ENTER: " ++ toString b
return emptyBuffer
getKeyAction 65360 = Just . liftM $ leftMost
getKeyAction 65361 = Just . liftM $ left
...
getKeyAction _ = Nothing
然后我做:
let
eBufferActions = filterJust $ getKeyAction <$> eKey
bBuffer = accumB (return emptyBuffer) eBufferActions -- model `b`
eBuffer <- changes bBuffer
reactimate' $ fmap displayBuffer <$> eBuffer
对于一些displayBuffer :: IO Buffer -> IO ()
.
它似乎没有按预期工作。bBuffer
似乎重新评估了每个事件的状态(每次事件发生时有效地运行IO
迄今为止收集的所有动作),当我回想起来时,这是有道理的。
我应该如何重构我的代码才能正确地做到这一点?(即IO
动作看到缓冲区的当前状态,除了缓冲区之外什么都没有积累)
如果我可以在适当的事件中构造一个Event
具有值的值,那么我可以简单地将我的专用动作映射到它和. 你怎么看?怎么做?会实现我想要做的事情吗?但是,在我拍摄with的快照以映射它之后,我将如何将当前更改推迟到与当前按键相关联?bBuffer
eKey
IO
reactimate
<@
b
b
<@
Buffer -> IO ()