Подтвердить что ты не робот

Почему повторение определено в Prelude как есть?

Repeat определяется следующим образом:

repeat :: a -> [a]
repeat x = xs where xs = x:xs

Есть ли причина, по которой следующие не используются?

repeat :: a -> [a]
repeat x = x : repeat x

(Очевидно, что для многих функций Prelude существует много эквивалентных определений, но мое последнее описание кажется гораздо более очевидным. Интересно, есть ли причина производительности или стиля для того, как это делается.)

4b9b3361

Ответ 1

Это относится к причинам сложности производительности и пространства.

В первой версии кода используется явный обмен; он в основном похож на одноэлементный круговой связанный список в памяти (xs в коде - это список node, который имеет x как значение, а его хвост указывает на тот же список node). Когда вы оцениваете все больше элементов списка, он будет повторно использовать те же самые node.

Напротив, вторая версия создает список, который на самом деле растет в памяти по мере его вычисления, потому что разные вызовы repeat x всегда пересчитываются (и не запоминаются). В конце сгенерированного списка всегда будет еще один неоценимый thunk.