我是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
我只是好奇为什么我不能这样做,以及匹配是如何实际的。
答案 0 :(得分:9)
match语句中的value1定义为一个新变量,其值设置为y(作为匹配项)。您在上面定义的value1将被忽略,就像您在C#函数中声明一个与类变量同名的局部变量一样。因此,第一个匹配条件将匹配所有,而不仅仅是先前定义的value1值,因此错误。希望澄清问题。
答案 1 :(得分:5)
模式匹配既是控制结构(接下来执行什么代码)又是绑定结构(比如'let',将名称绑定到值)。所以当你这样做时
match expr with
| name -> ...
模式(“name”)始终匹配,标识符“name”只是绑定到表达式的值。这就是模式匹配主要用于区分联合(案例类型)的原因,您可以根据结构进行匹配。 E.g。
match someOption with
| Some(x) -> ... // binds x
| None -> ...
match someList with
| h :: t -> ... // binds h and t to head/tail
| [] -> ...
答案 2 :(得分:1)
您可以将输入与[<Literal>]
属性标记的文字/标识符进行匹配,而不对其进行绑定。
例如:
#light
[<Literal>]
let E = 2.718281828459
let isE x =
match x with
| E -> true
| _ -> false
print_any (isE 3.2)
print_any (isE E)