我希望能夠在F#中編寫一個計算表達式,如果它引發異常,它將能夠重試一個操作。現在我的代碼如下所示:重試F#中的計算表達式或其他構造#
let x = retry (fun() -> GetResourceX())
let y = retry (fun() -> GetResourceY())
let z = retry (fun() -> DoThis(x, y))
etc. (this is obviously an astract representation of the actual code)
我需要能夠將每個功能重試的設定次數,這是我elswhere定義。
我想計算表達式可以幫助我在這裏,但我看不出它如何能幫助我刪除每個右側明確包裝到一個可重試<「T>
我能看到的計算表達式看起來應該是:
let! x = Retryable(fun() -> GetResourceX())
etc.
我明白單子,在粗時尚,是包裝類,但我希望解決的辦法。我知道我可以重載一個操作符,並有一個非常簡潔的語法來將操作轉換爲Retryable,但對我來說,這只是使重複/包裝更簡潔;它仍然在那裏。我可以將每個函數都包裝爲一個Retryable <'T>,但我再次看不到在頂部完成所做的事情的價值(在每個操作中調用重試,至少非常明確)。
也許計算表達式在這裏是錯誤的抽象,我不確定。關於在這裏可以做什麼的任何想法?
聽起來像一個很好的用例monad對我來說。 – hammar 2011-05-09 20:08:56
如果'DoThis'拋出的異常大於允許的次數,會發生什麼?它是否讓異常通過? – gradbot 2011-05-09 20:23:19
是的,它只是拋出。 – ProgrammerByDay 2011-05-09 20:26:30