我是一名新的程序员,也是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#。这个问题的推荐方法是什么?
答案 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中找到有关可以执行的模式匹配类型的更多详细信息。