Может ли реактивный банан обрабатывать циклы в сети?

У нас есть такой код:

 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

это работает отлично.

Какие-либо предложения?

Ответы на вопрос(1)

Ваш ответ на вопрос