【问题标题】:F# - Converting a for-each loop to a lambda expressionF# - 将 for-each 循环转换为 lambda 表达式
【发布时间】:2016-04-06 11:22:43
【问题描述】:

我一直在努力弄清楚如何将 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 表达式?

谢谢

【问题讨论】:

标签: json foreach lambda f#


【解决方案1】:

您似乎正在寻找这个:

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

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

如果你想让代码更实用,主要的问题是:你为什么要迭代? for ... in ... do.iter 都是执行副作用而不是返回值的命令式构造。我不会称其中一个比另一个更实用。对于更实用的样式,您可能希望寻找从数据中构建新的、不可变的值的东西,例如地图或折叠。 虽然我不知道你的用例,所以这可能是也可能不是一个好的选择。

疯狂的假设

作为一个被广泛猜测的例子,如果我假设 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-06
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多