【发布时间】:2015-10-12 18:55:57
【问题描述】:
假设我捕获按键并相应地操作代码缓冲区:
let
bCode = accumB emptyCode eModifications
eCodeChanges <- changes bCode
我想创建另一个行为bEval
bEval = accumB freshEnv (magic eCodeChanges)
将任何代码状态映射到其评估(仅在某些事情真正发生变化时触发)。
但是,评估发生在 monad Interpreter 中(想想来自 hackage 的 hint)。我真的可以定义这样的行为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 实际上只有MonadIO?
【问题讨论】: