f# - 匹配受歧视 child 的工会

标签 f# discriminated-union

如果我有一个有多个值共享一个子项的可区分联合( AppleMoreApples 都具有类型 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"

有没有办法匹配子联合以消除重复? - 就像是:
let speakFruit2 = function
  | _ GrannySmith -> "granny smith"
  | _ Gala -> "gala"
  | Banana -> "banana"

最佳答案

我认为使用单一模式没有什么好的方法可以做到这一点,但是您可以定义一个事件模式,该模式将为您提供合并两种苹果的数据的另一种视角:

let (|AnyApple|Banana|) = function
  | Apple a | MoreApples a -> AnyApple a
  | Banana -> Banana 

这隐藏了标准 Banana定义 - 您可能应该使用另一个名称以避免混淆,但其余的保持不变。现在您可以使用 AnyApple 进行模式匹配:
let speakFruit = function
  | AnyApple GrannySmith -> "granny smith"
  | AnyApple Gala -> "gala"
  | Banana -> "banana"

关于f# - 匹配受歧视 child 的工会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41807027/

相关文章:

f# - 为什么 F# 歧视联合无法使其 TypeConverter 受到 JSON.NET 的尊重,而其他类型却可以?

F# 联合案例参数化

F# 定义函数以充当 .net 操作的委托(delegate)

generics - 在 F# 中,两种泛型类型约束表示有什么区别

f# - 有没有办法让这种延续传递与 codata 示例在 F# 中工作?

f# - 在 F# 中从 char 隐式转换为 char[]?

dynamic - 是否可以在 fsharp 中动态生成可识别联合?

f# - 为什么不能将带有 byref 的函数直接转换为委托(delegate)?

reflection - F# 可区分联合的拆箱值

c++ - 如何在 C++ 中实现无参数仿函数及其返回值的有区别 union ?