检查几个选项类型,然后转换为类型

Check several option types and then convert to type

总的来说,我是一名新程序员,对于 F# 也是如此。我已经 运行 多次解决这个问题,但我认为还没有有效地解决它。问题是:

我有这些示例类型:

 type Retail1 = | Fashion | Auto | Sports
 type Wholesale1 = | Fashion | Auto | Sports
 type Events1 = | Wedding | Birthday 

 type Product = 
      | Retail of Retail1 | Wholesale of Wholesale1 | Events of Events1
      | NoProduct

我想通过函数将前三种类型的可能性转换为Product类型:

 let convertToProduct (retail: Retail1 option) 
      (wholesale: Wholesale1   option) (events: Events1 option) =
      // convert to Product here
      if retail.IsSome then Retail retail
      elif wholesale.IsSome then Wholsale wholseale
      elif events.IsSome then Events events
      else NoProduct

我在 pass 中处理它的方式只是将一个长的 if elif 语句链接在一起以检查每个条件和 return Product 的最终类型,但这感觉不正确,或者至少符合 F# 的习惯。解决此问题的推荐方法是什么?

这样的事情怎么样:

let convertToProduct (retail: Retail1 option) (wholesale: Wholesale1 option) (events: Events1 option) =
    match (retail, wholesale, events) with
    |Some rt, None, None -> Retail rt
    |None, Some wh, None -> Wholesale wh
    |None, None, Some ev -> Events ev
    |_ -> NoProduct

这利用了以下事实:如果将所有参数转换为元组,则可以对结果进行非常简洁的模式匹配。

模式匹配实际上非常强大,您可以在 MSDN documentation.

中找到有关可以执行的模式匹配类型的更多详细信息