AFAIK,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
非常渴望。不幸的是,这个类是密封的,因此,我们需要定义其中的三个并实现其中两个(与定义和实现一个相反)的同一类的急切和懒惰版本。重点是返回一个Try
而没有其他软件层担心该代码的执行时间,即抽象。
答案 0 :(得分: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)
...
}
请注意,不有LazySuccess
和LazyFailure
,因为在运行block
之前您不知道要使用哪个类。