我正在尝试使用从我们心爱的堆栈溢出中获取的 Retry Monad:
type RetryBuilder(max, sleep : TimeSpan) =
member x.Return(a) = a
member x.Delay(f) = f
member x.Zero() = failwith "Zero"
member x.Run(f) =
let rec loop(n) =
if n = 0 then failwith "Failed"
else
try f()
with ex ->
sprintf "Call failed with %s. Retrying." ex.Message |> printfn "%s"
Thread.Sleep(sleep);
loop(n-1)
loop max
我想用它来使我的文件复制代码更加健壮:
let retry = RetryBuilder(3, TimeSpan.FromSeconds(1.))
retry {
System.IO.File.Move("a", "b")
}
现在我注意到它有时会因“零”异常而失败。我试图删除member x.Zero() = failwith "Zero"
但现在我得到一个编译时错误:
仅当构建器定义“零”方法时才能使用此构造。
任何想法如何进行?