为什么这不起作用?
type RetryBuilder(max) =
member x.Return(a) = a // Enable 'return'
member x.Delay(f) = f // Gets wrapped body and returns it (as it is)
// so that the body is passed to 'Run'
member x.Zero() = failwith "Zero" // Support if .. then
member x.Run(f) = // Gets function created by 'Delay'
let rec loop 0 (Some(ex)) = raise ex
let rec loop n maybeEx = try f() with ex -> loop (n-1) (Some(ex))
loop max None
let retry = RetryBuilder(4)
它表示'表达式上的'不完整模式匹配。例如,值“1”可能表示模式未涵盖的情况。
但为什么不符合下面那个?如果我没记错的话,Haskell会匹配,为什么不F#?
答案 0 :(得分:5)
您正在使用Haskell语法编写F#代码。你的代码编译的原因是F#编译器认为有两个loop
函数,前者被后者遮蔽。显然,在第一个loop
函数中,模式匹配失败,第一个参数与0
不同,第二个参数为None
。
接近Haskell语法的声明可能是:
let rec loop = function
| 0, Some ex -> raise ex
| n, maybeEx -> try f() with ex -> loop (n-1, Some ex)
loop(max, None)