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

F# 函数签名中的F模式匹配,f#,pattern-matching,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

为什么这样不行

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”可能表示模式“1”未涵盖的情况


但是为什么它跟下面的不一样呢?如果我没记错的话,Haskell会匹配的,为什么F不呢?

您正在用Haskell语法编写F代码。代码编译的原因是F编译器认为有两个循环函数,前者被后者隐藏。显然,在第一个循环函数中,模式匹配失败,第一个参数的整数与0不同,第二个参数的整数与0不同

接近Haskell语法的声明可以是:

let rec loop = function 
    | 0, Some ex -> raise ex
    | n, maybeEx -> try f() with ex -> loop (n-1, Some ex)
loop(max, None)

有趣的很好,很紧凑,但是w/元组而不是f-n,不过我仍然感兴趣;为什么F做不到以上的工作呢?我想这是历史原因造成的。您的声明在OCaml/SML中也不起作用。与Haskell不同,在OCaml/F中,必须使用let rec来声明函数;太多的let rec似乎不经济。