По какой-то причине подобные шаблоны просто запрещены.Только шаблоны с ровно одним результатом могут принимать дополнительные параметры.
Это допустимо:
let (|A|) x y = if x = y then 5 else 42
let f (A "foo" a) = printfn "%A" y
f "foo" // Prints "5"
f "bar" // Prints "42"
И это разрешено:
let (|B|_|) x y = if x = y then Some (y+5) else None
let f = function
| B 42 x -> printfn "%d" x
| _ -> printfn "try again"
f 42 // prints "47"
f 5 // prints "try again"
Но это все.Все остальные активные шаблоны должны быть без параметров.И то, и другое незаконно:
let (|A|B|) x y = ...
let (|A|B|_|) x y = ...
Если бы мне пришлось размышлять, я бы сказал, что это связано с предсказуемой производительностью во время выполнения.Когда шаблон либо совпадает, либо нет, компилятор может запустить его ровно один раз для каждого значения параметра.Но если шаблон возвращает несколько вещей, и некоторые из этих вещей присутствуют в выражении соответствия, а другие - нет, и не все из них имеют один и тот же параметр - становится очень сложно найти лучший способ сделать минимумколичество вызовов функций.