Как определять коммутативные шаблоны в Ocaml с помощью сопоставления с образцом?

Мне нужно обнаружить коммутативный шаблон в одной из моих функций. Я думал, что написание следующего поможет:

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) приведет к ошибке сопоставления с образцом. Я знаю, почему (благодаря ответам ниже), и я понимаю, как я могу заставить его работать, если у меня есть разные конструкторы для каждого элемента (как в ответе Ашиша Агарвала). Можете ли вы предложить способ заставить его работать в моем случае?

7
задан Calin 10 May 2011 в 21:09
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: