scala – 一个Stream的头部究竟是如何评估的?
发布时间:2020-12-16 19:09:55 所属栏目:安全 来源:网络整理
导读:通常如果您创建一个Stream对象,那么头会被热切地评估: scala Stream( {println("evaluating 1"); 1},2,3)evaluating 1res63: scala.collection.immutable.Stream[Int] = Stream(1,?) 如果我们创建一个我们在同一个语句中预先添加的Stream,那么在连接之前头
通常如果您创建一个Stream对象,那么头会被热切地评估:
scala> Stream( {println("evaluating 1"); 1},2,3) evaluating 1 res63: scala.collection.immutable.Stream[Int] = Stream(1,?) 如果我们创建一个我们在同一个语句中预先添加的Stream,那么在连接之前头并没有被评估,似乎有点令人惊讶.即 scala> 0 #:: Stream( {println("evaluating 1"); 1},3) res65: scala.collection.immutable.Stream[Int] = Stream(0,?) (#::是正确关联的,是ConsWrapper的前缀方法,它是Stream的一个隐式类.) 在加上0之前,这不能评估它的头?是否在尾部流(或cons单元格)不存在堆,直到我们从结果流获取值?但是如果是这样,我们如何在不存在的对象上调用#::方法呢? 解决方法
-Xprint:typer是您的朋友,任何时候您想要了解一些代码是如何评估的或类型被推断的.
scala -Xprint:typer -e '0 #:: Stream( {println("evaluating 1"); 1},3)' val x$1: Int = 0; Stream.consWrapper[Int](Stream.apply[Int]({ println("evaluating 1"); 1 },3)).#::(x$1)
scala> (1 #:: (sys.error("!!"): Stream[Int])).head res1: Int = 1 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |