scala是否有一个懒惰的评估包装器?

时间:2015-08-26 05:24:38

标签: scala lazy-evaluation

我想返回一个包装器/ 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。

快速搜索指向StreamsDelayedLazyVal,但这两者都不是我想要的。

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"

1 个答案:

答案 0 :(得分:1)

我认为您可以使用scalaz.Need {/ 1}}。