2015-02-24 46 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

相關問題