我希望能够在 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)
我需要能够重试每个函数一定次数,这是我在其他地方定义的。
我在想一个计算表达式可以在这里帮助我,但我不明白它如何帮助我删除将每个右侧显式包装到 Retryable<'T>
我可以看到计算表达式看起来像:
let! x = Retryable( fun() -> GetResourceX())
etc.
我知道 Monads 以粗略的方式是包装器类型,但我希望有办法解决这个问题。我知道我可以重载一个运算符,并且有一个非常简洁的语法来将一个操作转换为 Retryable<'T>,但对我来说,这只是让重复/包装更简洁;它还在那里。我可以将每个函数包装成一个 Retryable<'T>,但是再一次,我看不到做文章顶部所做的事情的价值(在每个操作上调用重试。至少它非常明确)。
也许计算表达式在这里是错误的抽象,我不确定。关于可以在这里做什么的任何想法?