2015-02-24 60 views
2

AFAIK,Iterator.map是懒惰的,而Vector.map渴望,基本上是因为它们是不同类型的单子。可以尝试懒惰或渴望在斯卡拉?

我想知道,如果有一种具有EagerTryLazyTry,其行为就像the current Try的任何机会,但后者(LazyTry)延迟传递,直到结果关闭的执行需要(如果需要的话)。

请注意,声明为lazy的东西在Scala中效果不佳,特别是它适用于给定范围。传递参数时(参数按名称)存在替代方法。问题是如何在将(懒惰)值返回到外部作用域时实现惰性行为。 Option基本上是长度为0或1的集合,对于懒惰集合(Iterator,Sequence),但限于长度为0或1(如OptionEither),这将是等效情况。我对Try特别感兴趣,即,使用LazyTry就像使用Try一样。我想这应该是在其他情况下类似(OptionEither)。

请注意,我们已经有EagerTry,因为目前的标准Try渴望。不幸的是,该类是封闭的,因此,我们需要定义其中的三个类并实现其中的两个(而不是定义和实现一个),从而拥有同一类的急切和懒惰的版本。重点是返回一个Try而没有其他软件层担心该代码的执行时间,即抽象。

回答

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) 
    ... 
} 

请注意,您LazySuccessLazyFailure,因为你不知道运行block前要使用的类。

+0

谢谢。这涵盖了'Try'的大部分方法和功能,但是不能使用模式匹配,这是一个很大的失望。对于这样的用途,我更喜欢[this](http://pastebin.com/g7Bys3gU)。在这种情况下,我们需要在做任何事情之前得到实际的价值,但它封装懒惰就好,唯一的问题是:它使用它不透明。我甚至进一步[尝试定义匹配方法](http://pastebin.com/9CkszZGf),但这种方法效果不佳,而且我的想法已经过时。 – Trylks 2015-02-25 13:56:46

+0

你可以用'def toTry = underlying'和模式匹配将它转换为'Try'。 – 2015-02-25 22:57:42

+0

或者用'unapply'方法添加'LazySuccess'和'LazyFailure'对象,这些方法在'underlying'上匹配。 – 2015-02-25 23:03:17

相关问题