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