F# - 将for-each循环转换为lambda表达式

时间:2016-04-06 11:22:43

标签: json foreach lambda f#

我一直在努力弄清楚如何将for-each循环转换为lambda表达式(纯粹只是为了促进更具功能性的编码风格)。

for airlineData in allAirlinesData do
    match airlineData with
    | (airlineCode, data) -> 
        let airlineFullName = data.GetProperty("full_name").AsString()
        let capacity = data.GetProperty("capacity").AsString()
        let aircraftCount = data.GetProperty("aircraft_count").AsArray()
        ...
    | _ -> ...

allAirlinesData(string * JsonValue)[]

是否有更简单的方法将值应用于airlineFullName,例如,不使用for-each循环而是使用lambda表达式?

由于

1 个答案:

答案 0 :(得分:1)

看来你正在寻找这个:

allAirlinesData |> Array.iter (fun (airlineCode, data) ->
        let airlineFullName = ...
        ...
    )

很难说哪个看起来更好。这会删除match行,但会添加需要再次关闭的额外括号。

如果你想让代码更具功能性,那么主要的问题是:你为什么要在第一时间进行迭代? for ... in ... do.iter都是执行副作用而不是返回值的命令式构造。我不会把一个功能称为另一个功能。对于更具功能性的样式,您可能希望从数据中查找构建新的不可变值的内容,例如map或fold。 虽然我不知道您的用例,但这可能是也可能不是一个好的选择。

狂野假设

作为一个疯狂的猜测示例,如果我假设airlineCode用作密钥而不用于构建航空公司数据,则导入数据的功能程序可能如下所示:

type Airline =
    { FullName : string
      ... }

    static member ofJson (data : JsonValue) =
        { FullName = data.GetProperty("full_name").AsString()
          ... }

let airlines =
    allAirlinesData
    |> Map.ofArray
    |> Map.map Airline.ofJson