キーの押下をキャッチし、それに応じてコード バッファーを操作するとします。
let
bCode = accumB emptyCode eModifications
eCodeChanges <- changes bCode
別の動作を作成したいbEval
bEval = accumB freshEnv (magic eCodeChanges)
コードの状態をその評価にマップします (何かが実際に変更された場合にのみトリガーされます)。
ただし、評価はモナドで行われInterpreter
ます (ハックから考え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
ですか?