Есть ли более элегантный или лучший способ написать коммутативную функцию на F#/OCaml вместо перечисления всех возможных случаев?
let commutative x y =
match x,y with
a, _ -> val1
|_, a -> val1
|b, _ -> val2
|_, b -> val2
...
|_,z -> |valN
Пока я писал вопрос, я подумал, что можно сделать функцию рекурсивной и поменять местами аргументы, если совпадение не найдено.
let rec commutative x y =
match x,y with
a,_ -> val1
|b,_ -> val2
...
|nox,noy -> commutative noy nox
Но если я приму этот подход, я не смогу иметь в функции случай по умолчанию, который соответствует всем, если я не добавлю еще один аргумент, значение которого указывает, вызывается ли функция во второй раз, и возвращаю значение по умолчанию вместо вызова функции с замененным аргументы, если это так.
Любые другие идеи? Предлагает ли язык конструкцию для выражения того факта, что функция, которую я определяю, является коммутативной?
| a, _ | _, a -> val1
. - person Dan Robertson   schedule 25.12.2019