Я хочу использовать FRP (т.е. реактивный банан 0.6.0.0) для моего проекта (GDB/MI внешний интерфейс). Но у меня проблемы с объявлением сети событий.
Есть команды из графического интерфейса и события остановки из GDB. Оба должны быть обработаны, и их обработка зависит от состояния системы.
Мой текущий подход выглядит так (я думаю, что это минимально необходимая сложность, чтобы показать проблему):
data Command = CommandA | CommandB
data Stopped = ReasonA | ReasonB
data State = State {stateExec :: Exec, stateFoo :: Int}
data StateExec = Running | Stopped
create_network :: NetworkDescription t (Command -> IO ())
create_network = do
(eCommand, fCommand) <- newEvent
(eStopped, fStopped) <- newEvent
(eStateUpdate, fStateUpdate) <- newEvent
gdb <- liftIO $ gdb_init fStopped
let
eState = accumE initialState eStateUpdate
bState = stepper initialState eState
reactimate $ (handleCommand gdb fStateUpdate <$> bState) <@> eCommand
reactimate $ (handleStopped gdb fStateUpdate <$> bState) <@> eStopped
return fCommand
handleCommand
и handelStopped
реагируют на команды и останавливают события в зависимости от текущего состояния. Возможными реакциями являются вызов (синхронных) функций ввода-вывода GDB и запуск событий обновления состояния. Например:
handleCommand :: GDB -> ((State -> State) -> IO ()) -> State -> Command -> IO ()
handleCommand gdb fStateUpdate state CommandA = case stateExec state of
Running -> do
gdb_interrupt gdb
fStateUpdate f
where f state' = state' {stateFoo = 23}
Проблема в том, что когда f
оценивается accumE
, state'
иногда отличается от state
.
Я не уверен на 100%, почему это может произойти, поскольку я не полностью понимаю семантику времени и одновременности, а также порядок «реактивации» в реактивном банане. Но я предполагаю, что функции обновления состояния, запущенные handleStopped
, могут быть оценены до f
, что изменит состояние.
В любом случае, эта сеть событий приводит к несогласованному состоянию, потому что предположения f
о "текущем" состоянии иногда неверны.
Я пытаюсь решить эту проблему уже более недели, и я просто не могу понять это. Любая помощь горячо приветствуется.
where f state' ...
. - person Heinrich Apfelmus   schedule 03.08.2012