1

我的问题很简单:如何翻译这段 C 代码:

if (x == y + 1)
  // some code
else if (x == y - 1)
  // some code
else if (x == y + 2)
   ....

基本上我正在考虑使用似乎合适的模式匹配。不幸的是,这样的模式不起作用:

match x with
| y + 1 -> some code
| y - 1 -> some code
| y + 2 -> some code
| _ -> some code

编译器似乎并不高兴,从我发现的情况来看,像我一样在模式匹配上的表达式是不被容忍的。因此,我尝试将它们放入值中:

let v1 = y + 1 in
let v2 = y - 1 in
let v3 = y + 2 in
match x with
| v1 -> some code
| v2 -> some code
| v3 -> some code
| _ -> some code

不幸的是,我收到警告说我的值 v1 v2 和 v3 未使用,并且使用它们的匹配案例也未使用。

如何正确地将表达式与其他表达式匹配?

谢谢

4

3 回答 3

2

实际上,您的 C 代码几乎是有效的 OCaml 代码。

if x = y + 1 then
  (* some code *)
else if x = y - 1 then
  (* some code *)
else if x = y + 2 then
   ....

模式匹配不是替代品if then,它有完全不同的目的。OCaml 允许您构造类型,例如type 'a option = None | Some of 'a应该使用模式匹配来解构这些类型。它不应该用于其他目的。

于 2013-04-25T14:07:53.763 回答
2

如果你坚持使用 amatch你可以使用

match x with
| z when z=y+1 -> ...
| z when z=y-1 -> ...
于 2013-05-04T11:13:08.477 回答
1

Thomash 是对的,这段代码自然是用ifOCaml 中的表达式表达的,而不是模式。您的示例不起作用的原因是模式由常量和新定义的变量组成。如果一个变量(一个名字)出现在一个模式中,它变成一个新定义的名字,它的值是匹配表达式的对应部分。名称的任何先前定义在匹配中都不相关。

如果您绝对必须使用 a match,您可以编写如下:

match y - x with
| -1 -> (* some code *)
| 0 -> (* some code *)
| 1 -> (* some code *)
| 2 -> (* some code *)
| _ -> (* some code *)

但我和托马斯在一起,我认为if这里的表达会更好。

于 2013-04-25T14:42:36.360 回答