F#与两个值匹配
我对F#还相当陌生,我想用(match…with…)语法比较两个值 当我尝试比较以下两个值时,会出现问题: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
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)
据