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

时间:2012-02-09 18:49:30

标签: 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)

它表示'表达式上的'不完整模式匹配。例如,值“1”可能表示模式未涵盖的情况。

但为什么不符合下面那个?如果我没记错的话,Haskell会匹配,为什么不F#?

1 个答案:

答案 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)