是否有可能对歧视联盟的基本形状进行模式匹配?

时间:2015-12-18 09:50:06

标签: f# functional-programming pattern-matching discriminated-union active-pattern

F#是否支持区分联合成员实例的模式匹配Identifier pattern以外的标准?

例如,假设我想匹配数据的基础形状,并且我想考虑具有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 个答案:

答案 0 :(得分:4)

这是活动模式答案

let (|Pair|_|) input = 
    match input with
    |BinaryCase1(a,b)
    |BinaryCase2(a,b) -> Some(a,b)
    | _ -> None

和用法

match asCase1 with |Pair(a,b) -> printfn "matched" | _ -> ();;