错误:变量......必须出现在此|的两侧图案

时间:2011-11-27 15:05:40

标签: pattern-matching ocaml

我想写一个匹配如下的模式:

match ... with
...
| Const1 (r, c) | Const2 (m, n) 
  -> expr

它返回错误:Error: Variable c must occur on both sides of this | pattern

我是否必须写expr两次(Const1一次,Const2另一次)?有人可以帮忙吗?

2 个答案:

答案 0 :(得分:5)

正如错误消息所述,或模式(| pattern)需要绑定到同一组变量。因此:

match ... with
...
| Const1 (m, n) | Const2 (m, n) 
  -> expr

match ... with
...
| Const1 (m, n) | Const2 (n, m) 
  -> expr

会起作用。

当然,如果Const1Const2接受相同的类型,您就可以这样做。在某些情况下,如果你有一些具有相同类型的构造,你仍然会这样做:

match ... with
...
| Const1 (m, _) | Const2 (_, m) 
  -> expr

Or模式的缺陷是你不知道你所在的构造函数。所以如果expr的逻辑依赖于Const1Const2,你就不能使用Or模式了。

答案 1 :(得分:0)

作为解决这个问题的一个例子,请考虑如果expr依赖于rc并且您匹配的对象恰好是{{1}类型,会发生什么情况1}}:

Const2

由于let c2 = Const2(1,2) in match c2 with ... | Const1 (r,c) | Const2 (m,n) -> r + 1 的类型为c2Const2的右侧未定义r,因此OCaml不知道如何评估-> }}。编译器会发现这种情况会发生,并让您更改代码以避免它。

我的猜测是r+1不依赖于输入是expr还是Const1(否则你会将这些情况放在具有不同表达式的单独行上),所以你可以逃脱

Const2

如果您需要匹配match ... with ... | Const1 _ | Const2 _ -> expr Const1都有的某个字段,请参阅pad的答案。