scala正向引用扩展到了定义之上
为什么编译错误?:正向引用扩展到值的定义上 成对对象“流”, val one:Stream[Int]=Stream.scons(1,one)可以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
但在主要方法中,它不好(但…相同的合成物!)正向参考在
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)*/moveEmpty,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)
//}
}