Scala 是否有惰性评估包装器?

Does scala have a lazy evaluating wrapper?

我想 return 得到一个 wrapper/holder 的结果,我只想计算一次并且仅当结果被实际使用时。类似于:

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 and DelayedLazyVal,但两者都不是我要找的。

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

def compute(): Int = { println("computing"); 1 }

val s1 = compute() #:: Stream.empty
// computing is printed here, before doing s1.take(1)

同理,DelayedLazyVal从构造开始计算,甚至需要执行上下文:

val dlv = new DelayedLazyVal(() => 1, { println("started") })
// immediately prints out "started"

scalaz.Need,我认为您可以使用它。