可以尝试在Scala中懒惰或渴望?

时间:2015-02-24 17:03:10

标签: scala lazy-evaluation lazy-initialization eager

AFAIK,Iterator.map很懒,而Vector.map很渴望,主要是因为它们是不同类型的monad。

我想知道是否有可能EagerTryLazyTry表现得像the current Try,但后者(LazyTry)推迟了执行闭包直到需要结果(如果需要)。

请注意,声明lazy的内容在Scala中并不能很好地工作,特别是它适用于给定的范围。传递参数(按名称的参数)时存在替代方案。问题是在将(惰性)值返回到外部作用域时如何实现延迟行为。 Option基本上是长度为0或1的集合,这对于延迟集合(IteratorSequence)是等效的,但限制为长度0或1(如OptionEither)。我对Try特别感兴趣,即使用LazyTry完全与Try一样。我想这在其他情况下应该是类似的(OptionEither)。

请注意,我们已经EagerTry,因为当前标准Try非常渴望。不幸的是,这个类是密封的,因此,我们需要定义其中的三个并实现其中两个(与定义和实现一个相反)的同一类的急切和懒惰版本。重点是返回一个Try而没有其他软件层担心该代码的执行时间,即抽象。

1 个答案:

答案 0 :(得分:2)

是的,写LazyTry并不难。一种可能的方法:

sealed class LazyTry[A](block: => A) {
  // the only place block is used
  private lazy val underlying: Try[A] = Try(block)
  def get = underlying.get
  def isSuccess = underlying.isSuccess
  ...
}

object LazyTry {
  def apply[A](block: => A): LazyTry[A] = new LazyTry[A](block)
  ...
}

请注意,LazySuccessLazyFailure,因为在运行block之前您不知道要使用哪个类。