Hen*_*rik 2 f# pattern-matching
为什么这不起作用?
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)
Run Code Online (Sandbox Code Playgroud)
它说'表达式上的'不完整模式匹配.例如,值"1"可以表示模式未涵盖的情况.
但为什么不匹配下面那个呢?如果我没记错的话,Haskell会匹配那个,为什么不F#?
您正在使用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)
Run Code Online (Sandbox Code Playgroud)