我来自命令式编程背景,并且在理解如何实现(应该是)一个相对简单的编程任务时遇到了问题......
想象一下,我有一个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实例,该实例是使用已解析的Description
和Active
值来补充的吗?
我尝试过使用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
()
)
答案 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);
}