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似乎不经济。