É 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.