OCaml 模式匹配 int 和 bool

OCaml pattern matching with int and bool

1
2
3
4
5
let disting v =
  match v with
  | int -> (*expression1*)
  | bool -> (*expression2*)
  | _ -> (*expression3*)

每当我运行代码时,disting truedisting false 也会变成表达式 1。结果反之亦然,这段代码

1
2
3
4
5
let disting v =
  match v with
  | bool -> (*expression2*)
  | int -> (*expression1*)    
  | _ -> (*expression3*)

这个也有类似的问题。我怎样才能得到我想要的结果?


模式匹配并不像你想象的那样工作。

它允许您将表达式与值或值模式匹配,如下所示:

1
2
3
4
match some_int with
| 1  -> 1
| 10 -> 2
| x  -> x/2   (* this matches any possible int, and it gives it the name 'x' for the rest *)

所以在这里您将始终匹配您的第一个案例,因为它不会过滤任何内容。您的意思是:将 v 与任何内容匹配,然后在其余部分将其称为 \\'bool\\'。

然后你可以尝试类似

1
2
3
4
5
let disting v =
  match v with
  | true -> (*expression2*)
  | 2 -> (*expression1*)    
  | _ -> (*expression3*)

在 OCaml 中不进行类型检查,因为 \\'v\\' 是 int 或 bool,但不能同时是两者。
我不知道你想做什么,但你应该阅读一些关于语言的基础。


在 Ocaml 中做到这一点的方法是使用 sum 类型:

1
2
3
4
5
6
7
       type i_or_b = I of int | B of bool;
       let disting v =
         match v with
         | I x -> Printf.printf"v = I %d\
"
x
         | B x -> Printf.printf"v = B %s\
"
(string_of_bool x)