2

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

我想知道是否有任何机会让 aEagerTryLazyTry它的行为就像currentTry一样,但是后者 ( LazyTry) 延迟了闭包的执行,直到需要结果(如果需要)。

请注意,lazy在 Scala 中将内容声明为不太适用,特别是它适用于给定范围。传递参数时存在另一种选择(按名称传递参数)。问题是如何在将(惰性)值返回到外部范围时实现惰性行为。Option基本上是长度为 0 或 1 的集合,这将是惰性集合 ( Iterator, Sequence) 的等效情况,但长度限制为 0 或 1 (如Optionand Either)。我特别感兴趣Try,即LazyTry完全按照Try将要使用的方式使用。我想这在其他情况下应该是类似的(OptionEither)。

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

4

1 回答 1

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)
  ...
}

请注意,您没有LazySuccessand ,因为在运行之前LazyFailure您不知道要使用哪个类block

于 2015-02-24T18:45:29.180 回答