我希望能够在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.
我在想一个计算表达式可以帮助我,但是我没有看到它如何帮助我删除明确地将每个右侧包装到Retryable <'T>
我可以看到计算表达式看起来像:
let! x = Retryable( fun() -> GetResourceX())
etc.
我知道莫纳德,粗糙的,是包装类型,但我希望能解决这个问题.我知道我可以重载一个操作符并且有一个非常简洁的语法将操作转换为Retryable <'T>,但对我来说这只是让重复/包装更简洁; 它还在那里.我可以换每个功能是可重试<'T>,但再一次,我看不出在做什么在后的顶部完成值(每个操作调用重试.至少这是非常明确的).
也许计算表达式在这里是错误的抽象,我不确定.关于在这里可以做些什么的任何想法?