Мне нужно обнаружить коммутативный шаблон в одной из моих функций. Я думал, что написание следующего сделает работу:
let my_fun a b = match a,b with
(*...*)
| a,b
| b,a when is_valid b -> process b (***)
(*...*)
Это не работает, и Ocaml жалуется на , этот подшаблон не используется
предупреждение для линии, отмеченной (***)
.
1) Может кто-нибудь объяснить мне, что пытается сказать это предупреждение и почему это не работает?
2) Как я могу на самом деле написать это элегантно, не используя if then else
, учитывая тот факт, что я хочу узнать, какой аргумент is_valid
?
2) Можно ли получить намеченную функциональность, используя только сопоставление с образцом и без повторения when is_valid b -> process b
, как это происходит ниже?
let my_fun a b = match a,b with
(*...*)
| a,b when is_valid b -> process b
| b,a when is_valid b -> process b
(*...*)
Edit:
В моем конкретном примере a
и b
являются парами. Функция немного сложнее, но следующий случай иллюстрирует случай:
let f a b = match a,b with
| (a1,a2),(b1,b2)
| (b1,b2),(a1,a2) when b1 = b2 -> a1 + a2
Вызов f (1,1) (1,2)
приведет к неудачному совпадению с шаблоном. Я знаю, понимаю почему (благодаря ответам ниже) и понимаю, как я могу заставить его работать, если у меня есть разные конструкторы для каждого элемента (как в ответе Ашиша Агарвала). Можете ли вы предложить способ заставить его работать в моем случае?