Метод isEmpty в Stream оценивает весь поток? - PullRequest
3 голосов
/ 13 мая 2010

В Scala вызов метода isEmtpy для экземпляра класса Stream приводит к полной оценке потока? Мой код такой:

import Stream.cons

private val odds: Stream[Int] = cons(3, odds.map(_ + 2))
private val primes: Stream[Int] = cons(2, odds filter isPrime)

private def isPrime(n: Int): Boolean = n match {
  case 1 => false
  case 2 => true
  case 3 => true
  case 5 => true
  case 7 => true
  case x if n % 3 == 0 => false
  case x if n % 5 == 0 => false
  case x if n % 7 == 0 => false
  case x if (x + 1) % 6 == 0 || (x - 1) % 6 == 0 => true
  case x => primeDivisors(x) isEmpty
}


import Math.{sqrt, ceil}
private def primeDivisors(n: Int) =
  primes takeWhile { _ <= ceil(sqrt(n))} filter {n % _ == 0 }

Итак, вызов isEmpty в строке case x => primeDivisors(x) isEmpty вызывает оценку всех простых делителей или только первый?

Ответы [ 2 ]

9 голосов
/ 13 мая 2010

Только если поток фактически пустой:)

В противном случае он просто увидит, имеет ли поток заголовок и хвост (соответствует Stream.cons), и вернет false.

2 голосов
/ 14 мая 2010

Глядя на источник:

https://lampsvn.epfl.ch/trac/scala/browser/scala/trunk/src///library/scala/collection/immutable/Stream.scala#L550

предполагает, что если у вас есть экземпляр Stream.Cons, он не может быть пустым, поэтому всегда возвращает false. Поэтому представляется вероятным, что фабричный метод Stream.cons оценивает первый элемент, который можно показать, выполнив всего лишь:

Stream.cons(print("Hello"), Stream(print(" World!")))

в интерпретаторе, и, увидев это, выведите «Hello».

...