scala前向引用扩展了定义

Cur*_*ycu 7 scala

case object Empty extends Stream[Nothing]
case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A]

sealed trait Stream[+A] {

  def toList: List[A] = {
    val buf = new collection.mutable.ListBuffer[A]
    def go(s: Stream[A]): List[A] = s match {
      case Cons(h, t) =>
        buf += h()
        go(t())
      case _ => buf.toList
    }
    go(this)
  }

  def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = Stream.cons(hd, tl)

  def empty = Stream.empty

  def unfold[A, S](z: S)(f: S => Option[(A, S)]): Stream[A] = f(z) match {
    case Some((h,t)) => cons(h, unfold(t)(f))
    case None => empty
  }

  def take(n: Int): Stream[A] = unfold((this, n)) {
    case (Cons(h, t), 1) => Some((h(), (empty, 0)))
    case (Cons(h, t), n) if n > 1 => Some((h(), (t(), n-1)))
    case (Empty, 0) => None
  }
}

object Stream {

  def cons[A](hd: => A, tl: => Stream[A]): Stream[A] = Cons(() => hd, () => tl)

  def empty[A]: Stream[A] = Empty

  val ones: Stream[Int] = Stream.cons(1, ones)
}

object StreamTest {
  def main(args: Array[String]) {

    //why compile error: forward reference extends over definition of value ones
    /*val ones: Stream[Int] = Stream.cons(1, ones)
    println(ones.take(5).toList)*/

    println(Stream.ones.take(5).toList)
  }
}
Run Code Online (Sandbox Code Playgroud)

为什么编译错误?:前向引用扩展了有价值的定义

在对对象'流', VAL那些:流[INT] = Stream.scons(1,的)是确定

但在主要方法中,它不行(但是......同样的合成!)

som*_*ytt 8

本地vals不是成员.

对于测试代码,请执行以下操作:

object StreamTest extends App {
  //def main(args: Array[String]) {

    //why compile error: forward reference extends over definition of value ones
    val ones: Stream[Int] = Stream.cons(1, ones)
    println(ones.take(5).toList)

    println(Stream.ones.take(5).toList)
  //}
}
Run Code Online (Sandbox Code Playgroud)

块中的限制在这里的规范中有措辞,其他建议是在块中使它成为一个懒惰的val,具有相同的效果.