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

时间:2016-06-01 22:22:40

标签: f# pattern-matching discriminated-union option-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

我在传递中处理它的方式只是将一个long if if elif语句链接在一起以检查每个条件并返回最终类型的Product,但这感觉不正确,或者至少是惯用的F#。这个问题的推荐方法是什么?

1 个答案:

答案 0 :(得分:4)

这样的事情怎么样:

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中找到有关可以执行的模式匹配类型的更多详细信息。