如何在F#中的HttpMethod上进行模式匹配?

时间:2015-05-09 04:38:25

标签: f# pattern-matching

request来自HttpRequestMessage的{​​{1}},我尝试使用模式匹配来确定用于发出请求的方法。

这是一个人为的例子,它证明了我的问题:

System.Net.Http

导致:

  

分析程序错误:字段,构造函数或成员'获取'未定义

为什么这不起作用,我如何使用模式匹配或更合适的技术来实现相同的目标?

2 个答案:

答案 0 :(得分:6)

正如John Palmer在评论中指出的那样,你可以这样写:

let m =
    match request.Method with
    | x when x = HttpMethod.Get -> "GET"
    | x when x = HttpMethod.Post -> "POST"
    | _ -> ""

但是,如果你要重复这样做,你可能会发现这有点麻烦,在这种情况下你可以为它定义一些Active Patterns

let (|GET|_|) x =
    if x = HttpMethod.Get
    then Some x
    else None

let (|POST|_|) x =
    if x = HttpMethod.Post
    then Some x
    else None

这可以让你写这个:

let m =
    match request.Method with
    | GET _ -> "GET"
    | POST _ -> "POST"
    | _ -> ""

答案 1 :(得分:1)

另一种使用活动模式的方法最终会得到比Mark解决方案更好的代码,这是一种模式函数(使用完整分类模式):

let (|GET|POST|PUT|DELETE|OTHER|) x =
    if x = HttpMethod.Get
    then GET
    elif x = HttpMethod.Post
    then POST
    elif x = HttpMethod.Put
    then PUT
    elif x = HttpMethod.Delete
    then DELETE
    else OTHER

这种方法可让您摆脱模式匹配中的下划线:

let m =
    match request.Method with
    | GET -> "GET"
    | POST -> "POST"
    | _ -> ""