¿Es posible un rosal monádico perezoso y ancho primero?

Data.Tree incluyeunfoldTreeM_BF yunfoldForestM_BF funciona para construir árboles primero en amplitud utilizando los resultados de acciones monádicas. La carpeta de árbol se puede escribir fácilmente usando la carpeta de bosque, así que me centraré en lo último:

unfoldForestM_BF :: Monad m =>
             (b -> m (a, [b])) -> [b] -> m [Tree a]

Comenzando con una lista de semillas, aplica una función a cada una, generando acciones que producirán las raíces de los árboles y las semillas para el siguiente nivel de desarrollo. El algoritmo utilizado es algo estricto, por lo que usarunfoldForestM_BF con elIdentity mónada no es exactamente lo mismo que usar el purounfoldForest. He estado tratando de averiguar si hay una manera de hacerlo flojo sin sacrificar suO(n) limitados en el tiempo. Si (como Edward Kmett me sugirió) esto es imposible, me pregunto si sería posible hacerlo con un tipo más restringido, que requiere específicamenteMonadFix más bien queMonad. El concepto sería establecer (de alguna manera) los punteros a los resultados de los cálculos futuros mientras se agregan esos cálculos a la lista de tareas pendientes, por lo que si son vagos en los efectos de los cálculos anteriores estarán disponibles de inmediato.

Respuestas a la pregunta(1)

Su respuesta a la pregunta