函数签名中的F#模式匹配

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#?

pad*_*pad 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)
Run Code Online (Sandbox Code Playgroud)