为什么Scala工作表会评估流?

时间:2018-03-30 22:23:34

标签: scala

我是Scala的新手。我创建了两个流,我假设它们被懒惰地评估。第一个适当地有一个'。'。但是,我期待第二个也正确构建。为什么Scala解释器会评估流。

enter image description here

2 个答案:

答案 0 :(得分:0)

您正在同伴对象Stream上调用Stream.apply

apply方法有签名:

def apply(as: A*): Stream[A]

特别是,没有通过=>按名称传递的参数。因此,立即评估传递给apply的每个参数。在这里,立即评估(1/0),并抛出异常。

如果您想懒惰地评估第二个元素,可以使用fill

val s = 42 #:: Stream.fill(1){ 1/0 }  // works
s.take(2).toList                      // throws exception

答案 1 :(得分:0)

Stream.apply功能(当您执行Stream(...)时,您正在调用的功能)并未按名称使用其参数。

来自scala.collection.immutable.Stream

def apply[A](xs: A*): Stream[A] 

所以它需要所有的论据"通常"办法。您的1/0在被放入流之前正在进行评估。