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