В чем разница между LazyList и Stream в Scala?

Я заметил, что Stream устарел в Scala 2.13, и они предлагают использовать LazyList. Они также говорят: «Используйте LazyList (полностью ленивый) вместо Stream (у которого есть только ленивый хвост)».
Что это точно означает? Почему они устарели Stream ?


person Michael    schedule 08.02.2020    source источник
comment
По сути, Stream ленился только на своем tail, поэтому всегда вычислялся head. Для многих это было неожиданно и приводило к ошибочному коду. С другой стороны, LayzList полностью ленив. Он не вычисляет голову, пока не будет вызван. Обратите внимание, что при вычислении заголовка LayzList также вычисляется его хвост, и наоборот.   -  person Luis Miguel Mejía Suárez    schedule 08.02.2020
comment
Понятно. Спасибо.   -  person Michael    schedule 08.02.2020
comment
@LuisMiguelMejíaSuárez Есть ли пример ошибочного кода, к которому это может привести?   -  person Mario Galic    schedule 08.02.2020
comment
@MarioGalic не ошибочен в смысле правильности. Но ошибочный в смысле того, как он себя вел.   -  person Luis Miguel Mejía Suárez    schedule 08.02.2020


Ответы (2)


NthPortal, участник LazyList, сообщает в Обновление и улучшение документации LazyList #7842

Ключевое различие между LazyList и Stream - и его ключевая особенность - заключается в том, что независимо от того, ленив он или нет, оценивается лениво. Я не уверен, как лучше передать это.

jwvh заявляет в связанном вопросе

Stream элементы реализуются лениво, кроме 1-го (головного) элемента. Это было воспринято как недостаток.

Примечания к выпуску Scala 2.13 состояние

immutable.LazyList заменяет immutable.Stream. Stream имел другое ленивое поведение и теперь устарел. (#7558, #7000)

person Mario Galic    schedule 08.02.2020

Согласно запись в блоге:

LazyList предпочтительнее Stream

Stream устарел в пользу LazyList. Как следует из названия, LazyList — это связанный список, элементы которого оцениваются лениво. Важным семантическим отличием от Stream является то, что в LazyList и голова ленивы, тогда как в Stream ленив только хвост.

Также в документации Stream:

Устарело (начиная с версии 2.13.0)

Используйте LazyList (полностью ленивый) вместо Stream (у которого есть только ленивый хвост)

person psyanite    schedule 23.06.2020