在 Scala 中 Try 可以是懒惰的还是急切的?

Can Try be lazy or eager in Scala?

AFAIK,Iterator.map 是惰性的,而 Vector.map 是急切的,主要是因为它们是不同类型的 monads。

我想知道是否有可能有一个 EagerTryLazyTry 的行为就像 the current Try,但后者 (LazyTry)延迟闭包的执行直到需要结果(如果需要的话)。

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

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

是的,不难写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,因为您不知道在[之前使用哪个class =22=] block.