scala - 在 Scala 中可以尝试懒惰还是热切吗?

标签 scala lazy-evaluation lazy-initialization eager

据我所知,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 是 eager。不幸的是,该类是密封的,因此,要拥有同一类的 eager 和 lazy 版本,我们需要定义其中三个并实现其中两个(而不是定义和实现一个)。重点是返回 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,因为您在运行之前不知道要使用哪个类 block

关于scala - 在 Scala 中可以尝试懒惰还是热切吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28701838/

相关文章:

ios - 必须使用延迟实例化的 UI View 将 subview 添加到 View Controller 两次

java - Spring 4 hibernate 4 JPA LazyInitializationException : failed to lazily initialize a collection of role

scala - Spark DataFrame 列名称未传递给从属节点?

list - 如何在函数式编程中对状态变化进行建模

haskell - 为什么 Eratosthenes 的筛选需要额外的辅助函数来合并无限列表?

angularjs - ionic : Get the currently visible items in ion-content

java - 延迟初始化完整性检查 : Variable might not have been initialized

用于转换为 `Option` 的 Scala 语法糖

scala - 解析 `Show` 类型类实例的隐式

java - 在 Clojure 的循环中使用副作用方法改变 Java 对象