Мне нужно обнаружить коммутативный шаблон в одной из моих функций. Я думал, что написание следующего поможет:
let my_fun a b = match a,b with
(*...*)
| a,b
| b,a when is_valid b -> process b (***)
(*...*)
Это не работает, и Ocaml жалуется на , что этот подшаблон не используется
предупреждение для строки, отмеченной (***)
.
1) Может ли кто-нибудь объяснить мне, что пытается сказать это предупреждение и почему это не работает?
2) Как я могу написать это элегантно, не используя if, то иначе
, учитывая тот факт, что что я хочу теперь узнать, какой аргумент is_valid
?
2) Можно ли получить предполагаемую функциональность, используя только сопоставление с образцом и без повторения , когда 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
(*...*)
Изменить:
В моем конкретном примере 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)
приведет к ошибке сопоставления с образцом. Я знаю, почему (благодаря ответам ниже), и я понимаю, как я могу заставить его работать, если у меня есть разные конструкторы для каждого элемента (как в ответе Ашиша Агарвала). Можете ли вы предложить способ заставить его работать в моем случае?