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