在 Scala 中 Try 可以是懒惰的还是急切的?
Can Try be lazy or eager in Scala?
AFAIK,Iterator.map
是惰性的,而 Vector.map
是急切的,主要是因为它们是不同类型的 monads。
我想知道是否有可能有一个 EagerTry
和 LazyTry
的行为就像 the current Try
,但后者 (LazyTry
)延迟闭包的执行直到需要结果(如果需要的话)。
请注意,将内容声明为 lazy
在 Scala 中效果不佳,特别是它适用于给定范围。传递参数时存在另一种选择(按名称的参数)。问题是如何在将(惰性)值返回到外部范围时实现惰性行为。 Option
基本上是一个长度为 0 或 1 的集合,这与惰性集合(Iterator
、Sequence
)的等效情况相同,但限于长度 0 或 1(如 Option
和 Either
)。我对 Try
特别感兴趣,即使用 LazyTry
与 Try
完全一样。我想这在其他情况下应该是类似的(Option
和 Either
)。
请注意,我们已经有了 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)
...
}
请注意,您没有LazySuccess
和LazyFailure
,因为您不知道在[之前使用哪个class =22=] block
.
AFAIK,Iterator.map
是惰性的,而 Vector.map
是急切的,主要是因为它们是不同类型的 monads。
我想知道是否有可能有一个 EagerTry
和 LazyTry
的行为就像 the current Try
,但后者 (LazyTry
)延迟闭包的执行直到需要结果(如果需要的话)。
请注意,将内容声明为 lazy
在 Scala 中效果不佳,特别是它适用于给定范围。传递参数时存在另一种选择(按名称的参数)。问题是如何在将(惰性)值返回到外部范围时实现惰性行为。 Option
基本上是一个长度为 0 或 1 的集合,这与惰性集合(Iterator
、Sequence
)的等效情况相同,但限于长度 0 或 1(如 Option
和 Either
)。我对 Try
特别感兴趣,即使用 LazyTry
与 Try
完全一样。我想这在其他情况下应该是类似的(Option
和 Either
)。
请注意,我们已经有了 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)
...
}
请注意,您没有LazySuccess
和LazyFailure
,因为您不知道在[之前使用哪个class =22=] block
.