【问题标题】:Lazy for comprehension evaluation in scalascala中的理解评估延迟
【发布时间】:2012-06-15 00:03:15
【问题描述】:

我是 scala 和大多数函数式语言的新手,我目前正在尝试计算一个数字。我已经写了代码:

lazy val factors = for(int <- 2 until  math.ceil(math.sqrt(number)).toInt if number%int == 0) yield int

我想知道如果我将 scala val 声明为惰性,当我调用 factors.head 时它不会评估整个理解吗?

【问题讨论】:

    标签: scala functional-programming immutability lazy-evaluation for-comprehension


    【解决方案1】:

    没有。这是完全不同的事情:lazy 表示该值是在您第一次访问它时计算的。如果你想对集合进行惰性计算,你应该使用Stream 或使用视图。可以使用 view 从集合构建 Stream

    【讨论】:

      【解决方案2】:

      您的 factors 变量是惰性的; for 理解不是。当您第一次访问factors 时,您的for 理解将被全面评估。

      在 Scala 中,for 理解只是 flatMapmapwithFilter 方法调用的糖。因此,如果您的支持数据结构是严格的(例如 Range - 这是您正在使用的),那么您的 for 理解也将是严格的。如果数据结构是惰性的(例如Stream),那么for 理解也是如此。

      观察差异:

      scala> val number = 50
      number: Int = 50
      
      scala> lazy val factors = for(int <- 2 until  math.ceil(math.sqrt(number)).toInt if number%int == 0) yield int
      factors: scala.collection.immutable.IndexedSeq[Int] = <lazy>
      
      scala> factors.head
      res5: Int = 2
      
      scala> factors
      res6: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 5)
      
      scala> lazy val factors = for(int <- Stream.range(2, math.ceil(math.sqrt(number)).toInt - 1) if number%int == 0) yield int
      factors: scala.collection.immutable.Stream[Int] = <lazy>
      
      scala> factors.head
      res7: Int = 2
      
      scala> factors
      res8: scala.collection.immutable.Stream[Int] = Stream(2, ?)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 2021-05-17
        • 2016-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多