我们有这样的代码:
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,而 guiState 又输入 evtAutoLayout——所以那里有一个循环。这是故意的。自动布局调整 gui 状态,直到达到平衡,然后它返回 Nothing,因此它应该停止循环。当然,新的模型变化可以重新开始。
但是,当我们把它放在一起时,我们在编译函数调用中遇到了一个无限循环。即使 autoLayout = Nothing,它仍然会在编译期间导致堆栈溢出。
如果我删除 guiState 中的联合调用并从图片中删除 evtAutoLayout ......
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $ mkGuiState <$> changes model
它工作正常。
有什么建议么?