元组模式匹配失败



我想将一个元组与四个项进行匹配。

let tupleVar = (1.00, 2.00, 3.00, 4.00)
let verboseMsg (tupleInput: tuple) = 
match tupleInput with
| (var1, var2, var3, var4) -> printfn "4 part tuple: %f %f %f %f" var1 var2 var3 var4
| (var1, var2, var3) -> printfn "3-part tuple: %f %f %f" var1 var2 var3

虽然这个元组还不完整,但它已经在第一行匹配中抛出了这个错误:

ParserError: 
Line |
3 |      | (var1, var2, var3, var4) -> printfn "4 part tuple: %f %f %f %f" …
|             ~
| Missing argument in parameter list.

我想我可以在这个匹配的类中创建变量"var1"等。最后,我想检查元组中是否有null,但它在这里已经失败了。

为什么会出现此错误?

我从";Tuple Pattern";微软官方网站的:https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/pattern-matching#tuple-图案

Fyodor指出,3元组和4元组是两种不同的类型,因此不能同时匹配这两种类型。我认为你可能想要的是在列表类型上匹配,因为列表可以是可变长度的:

let listVar = [1.00; 2.00; 3.00; 4.00]
let verboseMsg listInput = 
match listInput with
| [var1; var2; var3; var4] -> printfn "4 part list: %f %f %f %f" var1 var2 var3 var4
| [var1; var2; var3] -> printfn "3-part list: %f %f %f" var1 var2 var3
verboseMsg listVar   // 4 part list: 1.000000 2.000000 3.000000 4.000000

Brian Berns的回答很准确:你不能用模式匹配来实现这一点。除了匹配可变长度的数据类型外,还可以进行面向对象的方法重载,但还有一个额外的问题。考虑:

type Foo = Foo with
static member T (var1, var2, var3, var4) = printfn "4 part tuple: %f %f %f %f" var1 var2 var3 var4
static member T (var1, var2, var3) = printfn "3-part tuple: %f %f %f" var1 var2 var3
Foo.T (1., 2., 3., 4.)
Foo.T (1., 2., 3.)

这很管用。绑定到变量的元组呢?

let t4 = 1., 2., 3., 4.
let t3 = 1., 2., 3.

作为论据,它们可以被视为(float * float * float * float)(float * float * float)类型,与它们声称拥有的float * float * float * floatfloat * float * float类型完全不同。

type Foo with
static member T ((var1, var2, var3, var4)) = Foo.T (var1, var2, var3, var4)
static member T ((var1, var2, var3)) = Foo.T (var1, var2, var3)
Foo.T t4
Foo.T t3

最新更新