Возможно ли сопоставить шаблон с основной формой различаемого объединения?
Поддерживает ли F# сопоставление с образцом экземпляра распознаваемого члена объединения по критериям, отличным от шаблона идентификатора?
Например, представьте, что я хочу сопоставить основную форму данных и хочу рассмотреть что-либо с int * int
форма, независимо от того, как DU классифицирует значение. Является
Вот как бы я это сделал сейчас:
type ExampleDU =
| BinaryCase1 of x:int * y:int
| BinaryCase2 of x:int * y:int
| UnaryCase1 of x:int
let underlyingValue = (1,2)
let asCase1 = BinaryCase1 underlyingValue
let asCase2 = BinaryCase2 underlyingValue
let shapeName =
match asCase1 with
| BinaryCase1 (x,y) | BinaryCase2 (x,y) -> "pair" // is this possible without explicitly writing the name for each part?
| _ -> "atom"
Я хотел бы что-то ближе к следующему:
let shapeName =
match asCase1 with
| (x,y) -> "pair"
| _ -> "atom"
Есть ли такой же выразительный синтаксис, который в настоящее время поддерживается в F#, или я застрял с явным указанием всех случаев?
Примечание: я знаю, что смог бы найти способ найти нужную информацию, но не заинтересован в таком решении.
1 ответ
Вот активный образец ответа
let (|Pair|_|) input =
match input with
|BinaryCase1(a,b)
|BinaryCase2(a,b) -> Some(a,b)
| _ -> None
и использование
match asCase1 with |Pair(a,b) -> printfn "matched" | _ -> ();;