É possível desabrochar uma roseira monádica preguiçosa e com a primeira largura?

Data.Tree incluiunfoldTreeM_BF eunfoldForestM_BF funções para construir árvores em largura usando os resultados de ações monádicas. O desdobramento da árvore pode ser escrito facilmente usando o desdobrador da floresta, então vou me concentrar no último:

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

Começando com uma lista de sementes, ela aplica uma função a cada uma, gerando ações que produzirão as raízes das árvores e as sementes para o próximo nível de desenvolvimento. O algoritmo usado é um pouco rigoroso, portanto, usarunfoldForestM_BF com oIdentity mônada não é exatamente o mesmo que usar o purounfoldForest. Eu tenho tentado descobrir se há uma maneira de torná-lo preguiçoso sem sacrificar suaO(n) tempo limite. Se (como Edward Kmett me sugeriu) isso for impossível, pergunto-me se seria possível fazê-lo com um tipo mais restrito, exigindo especificamenteMonadFix ao invés deMonad. O conceito seria (de alguma forma) configurar os ponteiros para os resultados de cálculos futuros e, ao mesmo tempo, adicioná-los à lista de tarefas, por isso, se forem preguiçosos nos efeitos de cálculos anteriores, eles estarão disponíveis imediatamente.

questionAnswers(1)

yourAnswerToTheQuestion