如何使用模式匹配来检查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