次のようなコードがあります。
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $
union (mkGuiState <$> changes model) evtAutoLayout
evtAutoLayout :: Event GuiState
evtAutoLayout = fmap fromJust . filterE isJust . fmap autoLayout $ changes guiState
evtAutoLayoutがevtAutoLayoutにフィードするguiStateにフィードすることがわかります。つまり、そこにサイクルがあります。これは意図的なものです。自動レイアウトは、平衡に達するまでGUI状態を調整し、その後Nothingを返すため、ループを停止する必要があります。もちろん、新しいモデルの変更で再び開始できます。
ただし、これをまとめると、コンパイル関数呼び出しで無限ループが発生します。autoLayout = Nothingの場合でも、コンパイル中にスタックオーバーフローが発生します。
guiStateでユニオン呼び出しを削除し、画像からevtAutoLayoutを削除すると...
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $ mkGuiState <$> changes model
それはうまくいきます。
助言がありますか?