Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F#匹配语法的澄清_F# - Fatal编程技术网

F#匹配语法的澄清

F#匹配语法的澄清,f#,F#,我试图澄清一些对我来说有点模糊的事情: let a, b = true, 3 match a, b with | true, x -> sprintf "true %i" x | false, _ -> "false" 在第一种匹配情况下,匹配true,并将b的值指定给x。 我难以接受的第一个部分是,比较时会读取“true”,但会指定x 但这是否意味着: match a, b with | c, x -> sprintf "true %b %i" c x | false, _

我试图澄清一些对我来说有点模糊的事情:

let a, b = true, 3
match a, b with
| true, x -> sprintf "true %i" x
| false, _ -> "false"
在第一种匹配情况下,匹配true,并将b的值指定给x。 我难以接受的第一个部分是,比较时会读取“true”,但会指定x

但这是否意味着:

match a, b with
| c, x -> sprintf "true %b %i" c x
| false, _ -> "false"

是否总是与第一句话相符?

您的假设是正确的。在匹配表达式中使用变量类似于使用下划线(在后一种情况下,您不打算使用下划线)。变量始终是100%匹配,因为它只捕获匹配位置中的任何内容

第二个示例将发出警告,最后一行永远不匹配

您的第一个示例也可以这样编写:

let a, b = true, 3
match a with
| true -> sprintf "true %i" b
| false -> "false"

匹配表达式始终尝试根据模式匹配值。有许多模式可以匹配。这里有常量模式(在与
true
false
匹配的情况下)和变量模式(在与
c,x
匹配的情况下)。如果所比较的值等于常数,则常数模式将匹配-变量模式将匹配任何输入并将输入值分配给变量

a,b
与模式
c,x
进行匹配基本上是将其与任何大小为2的无约束元组进行匹配,同时将
a
b
的值分配给新名称
c
x
。实际上,您拥有的与以下内容相同:

match a, b with
| _, _ -> sprintf "true %b %i" a b