据我所知,Iterator.map
是惰性的,而 Vector.map
是急切的,基本上是因为它们是不同类型的 monad。
我想知道是否有机会让 EagerTry
和 LazyTry
表现得像 the current Try
,但后者 (LazyTry
) 会延迟传递的闭包的执行,直到需要结果(如果需要)。
请注意,将内容声明为 lazy
在 Scala 中效果不佳,特别是它适用于给定范围。传递参数时存在另一种选择(按名称传递参数)。问题是如何在将(惰性)值返回到外部作用域时实现惰性行为。 Option
基本上是长度为 0 或 1 的集合,这与惰性集合(Iterator
、Sequence
)的等效情况相同,但长度有限0 或 1(如 Option
和 Either
)。我对 Try
特别感兴趣,即使用 LazyTry
与使用 Try
完全一样。我想这在其他情况下应该是类似的(Option
和 Either
)。
请注意,我们已经有了 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)
...
}
请注意,您没有有LazySuccess
和LazyFailure
,因为您在运行之前不知道要使用哪个类 block
。
关于scala - 在 Scala 中可以尝试懒惰还是热切吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28701838/