我想写一个匹配如下的模式:
match ... with
...
| Const1 (r, c) | Const2 (m, n)
-> expr
它返回错误:Error: Variable c must occur on both sides of this | pattern
。
我是否必须写expr
两次(Const1
一次,Const2
另一次)?有人可以帮忙吗?
答案 0 :(得分:5)
正如错误消息所述,或模式(| pattern
)需要绑定到同一组变量。因此:
match ... with
...
| Const1 (m, n) | Const2 (m, n)
-> expr
或
match ... with
...
| Const1 (m, n) | Const2 (n, m)
-> expr
会起作用。
当然,如果Const1
和Const2
接受相同的类型,您就可以这样做。在某些情况下,如果你有一些具有相同类型的构造,你仍然会这样做:
match ... with
...
| Const1 (m, _) | Const2 (_, m)
-> expr
Or模式的缺陷是你不知道你所在的构造函数。所以如果expr
的逻辑依赖于Const1
或Const2
,你就不能使用Or模式了。
答案 1 :(得分:0)
作为解决这个问题的一个例子,请考虑如果expr
依赖于r
或c
并且您匹配的对象恰好是{{1}类型,会发生什么情况1}}:
Const2
由于let c2 = Const2(1,2) in
match c2 with
...
| Const1 (r,c) | Const2 (m,n) -> r + 1
的类型为c2
,Const2
的右侧未定义r
,因此OCaml不知道如何评估->
}}。编译器会发现这种情况会发生,并让您更改代码以避免它。
我的猜测是r+1
不依赖于输入是expr
还是Const1
(否则你会将这些情况放在具有不同表达式的单独行上),所以你可以逃脱
Const2
如果您需要匹配match ... with
...
| Const1 _ | Const2 _ -> expr
和Const1
都有的某个字段,请参阅pad的答案。