Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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#_Pattern Matching - Fatal编程技术网

F#与两个值匹配

F#与两个值匹配,f#,pattern-matching,F#,Pattern Matching,我对F#还相当陌生,我想用(match…with…)语法比较两个值 当我尝试比较以下两个值时,会出现问题: let value1 = 19 let isValue1 y = match y with | value1 -> y + 1 | _ -> y 我得到一个警告,代码的“|->y”部分将永远无法访问。为什么会这样 我知道我可以执行以下操作以使函数按我希望的方式工作: let value1 = 19 let isValue1 y = match

我对F#还相当陌生,我想用(match…with…)语法比较两个值

当我尝试比较以下两个值时,会出现问题:

let value1 = 19
let isValue1 y =
    match y with
    | value1 -> y + 1
    | _ -> y
我得到一个警告,代码的“|->y”部分将永远无法访问。为什么会这样

我知道我可以执行以下操作以使函数按我希望的方式工作:

let value1 = 19
let isValue1 y =
    match y with
    | _ when y = value1 -> true
    | _ -> false
这同样有效

let value1 = 19
let isValue1 y =
    match y with
    | 19 -> true
    | _ -> false

我只是好奇为什么我不能这样做,以及匹配实际上是如何工作的。

match语句中的value1被定义为一个新变量,其值被设置为y(作为匹配)。上面定义的值1将被忽略,就像在C#函数中声明与类变量同名的局部变量一样。因此,第一个匹配条件将匹配所有内容,而不仅仅是先前定义的value1值,因此会出现错误。希望这能澄清问题。

模式匹配既是一个控制构造(接下来执行的代码)又是一个绑定构造(如“let”,将名称绑定到值)。所以当你这么做的时候

match expr with
| name -> ...
模式(“name”)始终匹配,标识符“name”仅绑定到表达式的值。这就是为什么模式匹配主要用于有区别的联合(案例类型),其中您根据结构进行匹配。例如

match someOption with
| Some(x) -> ... // binds x
| None -> ...

match someList with
| h :: t -> ... // binds h and t to head/tail
| [] -> ...

您只需将输入与
[]
属性标记的文本/标识符进行匹配,而无需对其进行绑定

例如:

#light
[<Literal>]
let E  = 2.718281828459


let isE x =
    match x with
    | E -> true
    | _ -> false

print_any (isE 3.2)
print_any (isE E)
#灯
[]
设E=2.718281828459
让我来看看=
将x与
|E->true
|_u->false
打印任何(isE 3.2)
打印任何(isE)