代码之家  ›  专栏  ›  技术社区  ›  Dilum Ranatunga

scala有一个懒惰的求值包装器吗?

  •  3
  • Dilum Ranatunga  · 技术社区  · 11 年前

    我想返回一个结果的包装器/持有者,我只想计算一次,并且只有当结果被实际使用时。类似于:

    def getAnswer(question: Question): Lazy[Answer] = ???
    
    println(getAnswer(q).value)
    

    这应该很容易使用 lazy val :

    class Lazy[T](f: () => T) {
      private lazy val _result = Try(f())
    
      def value: T = _result.get
    }
    

    但我想知道,标准API中是否已经有这样的东西。

    快速搜索指向 Streams DelayedLazyVal 但两者都不是我想要的。

    流确实对流元素进行了记忆,但似乎第一个元素是在构造时计算的:

    def compute(): Int = { println("computing"); 1 }
    
    val s1 = compute() #:: Stream.empty
    // computing is printed here, before doing s1.take(1)
    

    以类似的方式, 延迟时间值 在构建时开始计算,甚至需要执行上下文:

    val dlv = new DelayedLazyVal(() => 1, { println("started") })
    // immediately prints out "started"
    
    1 回复  |  直到 11 年前
        1
  •  1
  •   Hugh    11 年前

    scalaz.Need 我想你可以用它。