Qual é a diferença entre uma lista cíclica e uma lista infinita em haskell?
Referenciando a resposta do @ dfeuer a esta pergunta:Maneira menos cara de construir uma lista cíclica em Haskell, que diz que o uso de listas cíclicas 'derrota' o coletor de lixo, pois ele mantém tudo o que você consumiu de uma lista cíclica alocada até que você elimine a referência a quaisquer células contras na lista.
Aparentemente, em Haskell, uma lista cíclica e uma lista infinita são duas coisas separadas. Este blog (https://unspecified.wordpress.com/2010/03/30/a-doubly-linked-list-in-haskell/) diz que se você implementarcycle
do seguinte modo:
cycle xs = xs ++ cycle xs
é uma lista infinita, não uma lista cíclica. Para torná-lo cíclico, você deve implementá-lo desta maneira (como é encontrado no código-fonte do Prelude):
cycle xs = xs' where xs' = xs ++ xs'
Qual é exatamente a diferença entre essas duas implementações? E por que, se você está segurando uma célula contrária em algum lugar de uma lista cíclica, o coletor de lixo precisa manter tudo antes de ser alocado?