Ссылка на @dfeuer ответ на этот вопрос: Самый дорогой способ создания циклического списка в Haskell, в котором говорится, что использование циклических списков "поражает" сборщик мусора, поскольку он имеет чтобы сохранить все, что вы потребляете, из циклического списка, выделенного до тех пор, пока вы не отбросите ссылку на любые ячейки cons в списке.
По-видимому, в Haskell циклический список и бесконечный список - это две отдельные вещи. Этот блог (https://unspecified.wordpress.com/2010/03/30/a-doubly-linked-list-in-haskell/) говорит, что если вы реализуете cycle
следующим образом:
cycle xs = xs ++ cycle xs
это бесконечный список, а не циклический список. Чтобы сделать его циклическим, вы должны его реализовать таким образом (как в исходном коде Prelude):
cycle xs = xs' where xs' = xs ++ xs'
В чем же разница между этими двумя реализациями? И почему это так, что если вы держите на одной ячейке cons где-нибудь в циклическом списке, то сборщик мусора должен сохранить все до его выделения?