如何使用模式匹配来检查OCAML中是否存在某些内容?

如何使用模式匹配来检查OCAML中是否存在某些内容?,ocaml,Ocaml,我试过: let rec f n = match n with | 0 -> case0 | k -> case1 | (2*k) -> case2;; 但是没有起作用 模式匹配在ocaml中是结构化的。所以 | k -> case1 将检查匹配的值的结构是否与k相同(始终如此),然后将该值绑定到k。因此,任何不匹配0的项都匹配k。匹配中的任何变量都是绑定的,从不与现有绑定进行比较 接下来你有 | (2*k) -> case2 但是2*k不是任何值的结构。

我试过:

let rec f n =
match n with
| 0 -> case0
| k -> case1
| (2*k) -> case2;;
但是没有起作用



模式匹配在ocaml中是结构化的。所以

| k -> case1
将检查匹配的值的结构是否与k相同(始终如此),然后将该值绑定到k。因此,任何不匹配0的项都匹配k。匹配中的任何变量都是绑定的,从不与现有绑定进行比较

接下来你有

| (2*k) -> case2
但是
2*k
不是任何值的结构。它是一个表达式,或者如果忽略2是整数文本,它将是一个类型

如果你想匹配某个东西的值,你必须在你喜欢的时候使用

match n with
    | x when x mod 2 = 0 -> even
    | _ -> odd
更好的匹配方法是将
n%2
与0和1简单匹配。或者,因为这是一个正好匹配两个案例的匹配,所以只需使用

if n mod 2 = 0
then even
else odd