scala正向引用扩展到了定义之上

scala正向引用扩展到了定义之上,scala,Scala,为什么编译错误?:正向引用扩展到值的定义上 成对对象“流”, val one:Stream[Int]=Stream.scons(1,one)可以 但在主要方法中,它不好(但…相同的合成物!)正向参考在Cons[+A]…中,这一行中引用了: case object Empty extends Stream[Nothing] case class Cons[+A](h: () => A, t: () => Stream[A]) extends Stream[A] sealed trai

为什么编译错误?:正向引用扩展到值的定义上

成对对象“流”, val one:Stream[Int]=Stream.scons(1,one)可以


但在主要方法中,它不好(但…相同的合成物!)

正向参考在
Cons[+A]…
中,这一行中引用了:

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)
  }
}
试着移动

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

进入同伴对象。

本地VAL不是成员

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

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

块中的限制是用文字表示的,另一个建议是将其设置为块中的惰性val,这具有相同的效果。

@m-z请删除main方法中的注释符号(/**/),
/*val one:Stream[Int]=Stream.cons(1,one)println(one.take(5.toList)*/
move
Empty,Cons
转换为
对象流
并更改
Cons=>Stream.Cons和Empty=>Stream.Empty
以避免编译错误。但什么都改变不了!如果没有main方法,StreamTest对象将运行。。。我想可能是因为
扩展了App
<代码>延迟val
方法也很有效。区块中的限制非常有趣。谢谢
App
允许初始值设定项从
main
运行,但保留模板语义。
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)
  //}
}