Может ли реактивный банан обрабатывать циклы в сети?
У нас есть такой код:
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $
union (mkGuiState < guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $
union (mkGuiState <$> changes model) evtAutoLayout
evtAutoLayout :: Event GuiState
evtAutoLayout = fmap fromJust . filterE isJust . fmap autoLayout $ changes guiState
gt; changes model) evtAutoLayout
evtAutoLayout :: Event GuiState
evtAutoLayout = fmap fromJust . filterE isJust . fmap autoLayout $ changes guiState
Вы можете видеть, что evtAutoLayout подается в guiState, который вводится в evtAutoLayout - так что там есть цикл. Это намеренно. Автоматическая разметка регулирует состояние графического интерфейса до тех пор, пока оно не достигнет равновесия, а затем ничего не вернется, поэтому он должен остановить цикл. Конечно, новая смена модели может снова ее запустить.
Когда мы собираем это вместе, мы сталкиваемся с бесконечным циклом при вызове функции компиляции. Даже если autoLayout = Nothing, это все равно приводит к переполнению стека во время компиляции.
Если я удаляю вызов объединения в guiState и удаляю evtAutoLayout из картинки ...
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $ mkGuiState < guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $ mkGuiState <$> changes model
gt; changes model
это работает отлично.
Какие-либо предложения?