假设我抓住按键并相应地操作代码缓冲区:
let
bCode = accumB emptyCode eModifications
eCodeChanges <- changes bCode
我想创建另一种行为bEval
bEval = accumB freshEnv (magic eCodeChanges)
它将任何代码状态映射到其评估(仅在某些事情真正发生变化时触发)。
但是,评估发生在单子中Interpreter
(hint
从hackage考虑)。我真的可以定义这样的行为bEval
吗?我想我可以Interpreter String
在我的行为中拖拽为状态,累积currentAccumState >>= eval nextEvent
,但我将在哪里runInterpreter
实际强制评估?
编辑:重要的是,这些动作不仅仅是IO ()
而且应该修改某些状态。例如,考虑清除缓冲区/重置计数器/在拉链周围移动。
我的想法是这样的:
f :: a -> Maybe (b -> IO b)
mapJustIO :: (a -> Maybe (b -> IO b)) -> Event t a -> Event t (b -> IO b)
mapJustIO f e = filterJust $ f <$> e
accumIO :: a -> Event t (a -> IO a) -> Behaviour t (IO a)
accumIO z e = fold (>>=) (return z) e
我不明白为什么不可能有这样的事情。但是,我也看不到如何在行为中摆脱这种IO
情况:)。
为什么不实际IO
出现在reactive-banana
only中MonadIO
?