在F#中,如何根据解析的有效负载水合类型?

时间:2014-08-18 20:33:28

标签: f#

我来自命令式编程背景,并且在理解如何实现(应该是)一个相对简单的编程任务时遇到了问题......

想象一下,我有一个F#类型:

type MyType(description: string, active:bool) =
    member this.Description = description
    member this.Active = active

我想根据分隔的有效负载创建和补充此类型的实例:

DE=MyDescription;AC=0

其中,false的AC为0,true的AC为1。

我编写了几个函数来执行解析:

let RecordParser (record:string) = 
    record.Split([|';'|], StringSplitOptions.RemoveEmptyEntries)

let AttributeParser (kvp:string) =
    kvp.Split [|'='|]

解析分隔有效负载的函数的实现会返回一个新的MyType实例,该实例是使用已解析的DescriptionActive值来补充的吗?

我尝试过使用Array.iter的路线,但在match按键时,我似乎无法进行编译。我到目前为止:

let Hydrater payload
    let kvps = RecordParser payload
    kvps |> Array.iter(fun (x) -> 
    // How to match on the keys of "DE" and "AC" to extract the value and construct MyType
    ()
    )

1 个答案:

答案 0 :(得分:1)

我们假设MyType定义为record type一分钟:

type MyType = {
    Description : string
    Active : bool
}

您所描述的内容可以被视为在默认值之上覆盖的值的累积:

let hydrate payload = 
    let kvps = RecordParser payload
    let startingValue = { Description = ""; Active = false }
    kvps 
    |> Seq.fold 
        (fun state kvp -> 
            match kvp with
            | [| 'Description'; '='; description |] -> { state with Description = description }
            | [| 'AC'; '='; '0' |] -> { state with Active = false }
            | [| 'AC'; '='; '1' |] -> { state with Active = true }
            | _ -> failwith "Not implemented") startingValue

此处startingValue是“默认”值。 Seq.fold获取startingValue并将其用作state的初始值。在对函数进行每次评估之后,返回值将作为state传递给函数的下一次调用。通常,您可以使用Seq.fold替换C#中的某些foreach循环。

这个F#:

Seq.fold (fun state curr -> doSomething state curr) startingValue items

大致相当于这个C#:

var state = startingValue;
foreach(var curr in items) 
{
    state = doSomething(state, curr);
}
相关问题