与儿童歧视联盟相匹配

dav*_*v_i 3 f# discriminated-union

如果我有一个有多个值共享一个孩子的歧视联盟(Apple并且MoreApples都有类型Apple)......

type Apples =
  | GrannySmith
  | Gala

type Fruit =
  | Apple of Apples
  | MoreApples of Apples
  | Banana

let speakFruit = function
  | Apple GrannySmith 
  | MoreApples GrannySmith -> "granny smith"
  | Apple Gala 
  | MoreApples Gala -> "gala"
  | Banana -> "banana"
Run Code Online (Sandbox Code Playgroud)

有没有办法匹配子联合以删除重复?- 就像是:

let speakFruit2 = function
  | _ GrannySmith -> "granny smith"
  | _ Gala -> "gala"
  | Banana -> "banana"
Run Code Online (Sandbox Code Playgroud)

Tom*_*cek 5

我不认为使用单一模式有一个很好的方法,但您可以定义一个活动模式,它将为您提供另一种合并两种苹果的数据视角:

let (|AnyApple|Banana|) = function
  | Apple a | MoreApples a -> AnyApple a
  | Banana -> Banana 
Run Code Online (Sandbox Code Playgroud)

这隐藏了标准Banana定义 - 你应该使用另一个名称来避免混淆,但其余的保持不变.现在您可以使用AnyApple以下模式匹配:

let speakFruit = function
  | AnyApple GrannySmith -> "granny smith"
  | AnyApple Gala -> "gala"
  | Banana -> "banana"
Run Code Online (Sandbox Code Playgroud)