Возможно ли сопоставить шаблон с основной формой различаемого объединения?

Поддерживает ли 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" | _ -> ();;
Другие вопросы по тегам