Tenemos un código como éste:¿Puede el asa reactiva-banana ciclos en la red?
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $
union (mkGuiState <$> changes model) evtAutoLayout
evtAutoLayout :: Event GuiState
evtAutoLayout = fmap fromJust . filterE isJust . fmap autoLayout $ changes guiState
Se puede ver que evtAutoLayout alimenta en guiState que se alimenta en evtAutoLayout - por lo que hay un ciclo allí. Esto es deliberado. El diseño Auto ajusta el estado de la GUI hasta que alcanza un equilibrio y luego devuelve Nada y por lo tanto, debe detener el ciclo. Un nuevo cambio de modelo puede iniciarlo de nuevo, por supuesto.
Cuando juntamos esto, sin embargo, nos encontramos con un bucle infinito en la llamada a la función de compilación . Incluso si autoLayout = Nothing, todavía resulta en un desbordamiento de la pila durante la compilación.
Si quito la llamada unión en guiState y quitar evtAutoLayout de la foto ...
guiState :: Discrete GuiState
guiState = stepperD (GuiState []) $ mkGuiState <$> changes model
que trabaja muy bien.
¿Alguna sugerencia?
Como dijo que podía pedir aclaraciones/ejemplos ... en su filtro, ¿para qué sirve el primer parámetro? Si solo está convirtiendo un Evento en un Evento, ¿por qué tiene 2 params? ¿Y cómo usarías filterRising? ¡Gracias! – mentics
@taotree: Ah, el primer parámetro fue solo una especie de valor inicial. Ahora he cambiado el ejemplo para que coincida con la descripción. Usar la función 'filterRising' es simple: toma una secuencia de eventos como argumento y como resultado genera una nueva secuencia de eventos, por lo que puede aplicarla a una secuencia de eventos de su elección y obtener una nueva. –