F# 这是F中match with的正确用法,还是有更惯用的方法来实现这一点

F# 这是F中match with的正确用法,还是有更惯用的方法来实现这一点,f#,F#,代码从服务器获取json字符串,并将其解析为jObject,然后进行适当的分支 let j = JObject.Parse x match x, j with | _ when x = "pong" -> () | _ when j.ContainsKey "table" -> HandleTableMessages j x

代码从服务器获取json字符串,并将其解析为jObject,然后进行适当的分支

                   let j = JObject.Parse x
                    match x, j with
                    | _ when x = "pong" -> ()
                    | _ when j.ContainsKey "table" -> HandleTableMessages j x
                    | _ when j.ContainsKey "success" -> HandleSuccessMessages j
                    | _ when j.ContainsKey "error" -> HandleErrorMessages j
                    | _ when j.ContainsKey "info" -> j.SelectToken "info"  |> string |> this.Print
                    | _, null -> this.Error ("malformed message: " + x)
                    | _ -> this.Error("unknown message type: " + x)

我认为“when”部分有点重,我想知道是否有更好的F语法来表达这一点?

这是一个好迹象,表明您意识到这段代码不好。这表明你可能比大多数初学者更有品味。为任务使用最简单的结构是非常重要的

// Active Pattern
let (|Table|Success|Error|Info|Unknown|) (j: Newtonsoft.Json.Linq.JObject) =
    if j.ContainsKey "table" then Table
    elif j.ContainsKey "success" then Success
    elif j.ContainsKey "error" then Error
    elif j.ContainsKey "info" then Info
    else Unknown

match x, j with
| "pong", _ -> ()
| _, Table -> HandleTableMessages j x
| _, Success -> HandleSuccessMessages j
| _, Error -> HandleErrorMessages j
| _, Info -> j.SelectToken "info"  |> string |> this.Print
| _, null -> this.Error ("malformed message: " + x)
| _, Unknown
| _, _ -> this.Error("unknown message type: " + x)

将x,j与 |_uux=pong-> ... 首先请注意,x,j未使用,因此这简化为:

匹配 |_uux=pong-> ... 然后,您会意识到在单元上进行匹配是愚蠢的,您应该使用更简单的语句:

如果x=pong,那么 elif j.ContainsKey表然后HandleTableMessages j x ... 否则此.Errorunknown消息类型:+x
我刚刚注意到elif不在F备忘单中,因此我将尝试将其添加到其中,因为它是一个基本关键字。

这是一个好迹象,表明您意识到此代码不好。这表明你可能比大多数初学者更有品味。为任务使用最简单的结构是非常重要的

将x,j与 |_uux=pong-> ... 首先请注意,x,j未使用,因此这简化为:

匹配 |_uux=pong-> ... 然后,您会意识到在单元上进行匹配是愚蠢的,您应该使用更简单的语句:

如果x=pong,那么 elif j.ContainsKey表然后HandleTableMessages j x ... 否则此.Errorunknown消息类型:+x
我刚刚注意到elif不在F备忘单中,因此我将尝试将它添加到那里,因为它是一个基本关键字。

我将使用简单的if/else;起初,我认为可以有一些更可读的方法来使用match,但正如Charles在上面指出的,事实并非如此。但是,+1用于向我展示活动模式!我将使用简单的if/else;起初,我认为可以有一些更可读的方法来使用match,但正如Charles在上面指出的,事实并非如此。但是,+1用于向我展示活动模式!对于投票决定关闭的人:我对F很陌生,仍然在探索语法;if/else的答案是显而易见的,但这个问题是为了让我知道我是否在比赛中错过了什么,并在这个过程中学到了一些东西。结束这个问题是如何实现的呢?对于投票结束的人来说:我对F很陌生,仍然在发现语法;if/else的答案是显而易见的,但这个问题是为了让我知道我是否在比赛中错过了什么,并在这个过程中学到了一些东西。结束这个问题将如何实现这一点?