Бесконечные / ленивые структуры допускают идиому «завязывание узла»: http://www.haskell.org/haskellwiki/Tying_the_Knot
Канонически простым примером этого является последовательность Фибоначчи, определенная непосредственно как рекуррентное отношение. (Да, да, проведите обсуждение жалоб / алгоритмов эффективности - речь идет о идиоме .): fibs = 1:1:zipwith (+) fibs (tail fibs)
Вот другая история. У меня был некоторый код, который работал только с конечными потоками - он делал некоторые вещи, чтобы создать их до некоторой точки, а затем сделал целую кучу бессмыслицы, которая включала в себя воздействие на различные биты потока, зависящие от всего потока до этой точки, объединение его с информацией из другого потока и т. д. Это было довольно мило, но я понял, что у него есть целая куча ошибок, необходимых для работы с граничными условиями, и, в основном, что делать, когда в одном потоке кончается всякое. Затем я понял, что концептуально не было причины, по которой он не мог бы работать на бесконечных потоках. Поэтому я переключился на тип данных без нуля, то есть на подлинный поток, а не на список, и все бесполезно исчезло. Несмотря на то, что я знаю, что мне никогда не понадобятся данные после определенного момента, возможность полагаться на них, находясь там, позволила мне безопасно удалить много глупой логики и позволить математической / алгоритмической части моего кода выделяться более четко.