Я бы распечатал поток чисел, но следующий код выводит только первое число в последовательности:
for ( n <- Stream.from(2) if n % 2 == 0 ) yield println(n)
2
res4: scala.collection.immutable.Stream[Unit] = Stream((), ?)
В Haskell следующее продолжает печатать числа до тех пор, пока не будет прервано, и я хотел бы, чтобы подобное поведение происходило в Scala:
naturals = [1..]
[n | n <- naturals, even n]
[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,
[1..]
прекрасно справляется с этой задачей. Когда я использую этот ленивый список в понимании списка, он продолжает выдавать целые числа, пока интерпретатор Haskell не будет прерван. Я хотел бы такое же поведение в Scala. Я думал, чтоStream.from(1)
даст мне эту бесконечную ленивую последовательность (без принуждения или указания какой-либо дополнительной семантики), но, похоже, это не так. 16.06.2014Stream.from ...
действительно даст вам ленивую последовательность -- она настолько ленивая, что не печатает себя полностью. Теперь, чтобы его распечатать, нужно убрать лень, или другими словами заставить его. Да, между ними есть некоторая разница: Haskell по умолчанию ленив, scala по умолчанию активен и, в отличие от Haskell, различает жадный список (он же простоList
) и ленивый. Список (он жеStream
). 16.06.2014