在循环内插入数组

时间:2018-10-22 20:24:09

标签: xml f# f#-data

我正在尝试创建一个可用的经度和纬度对数组,它们在XML中返回。我正在使用F# Data来实现它,到目前为止,这就是我的目标。

// #r @"load data dll"

open FSharp.Data

type Html = XmlProvider<"<my-url>", Global=true>
let html = Html.GetSample()

// Create an availableList array, so that it would have pairs of available Latitude and Longitude
let availableList = Array.create

let getCoordinates available = 
  for item in html.Objects do
    if item.StatusParkPlace = available then
      // If true, push item.Latitude and item.Longitude into availableList 

let main = 
  getCoordinates true

main

我知道第9行的array初始化不正确,我也知道第13行的条件if语句未完成。我可以按照以下步骤在第14行上打印出对,但是我看不到这对我有什么用:

printfn "%A - %A" item.Latitude item.Longitude

1 个答案:

答案 0 :(得分:4)

在函数式编程中,请尝试通过遍历数据和项目到新列表来避免建立列表。这是命令式方法,它依赖于更改共享状态。

在您的示例中,请考虑采用这种方式:

let getCoordinates available = 
  html.Objects
  |> Seq.filter (fun item -> item.StatusParkPlace = available)
  |> Seq.toList

let main = 
  let availableList = getCoordinates true

结果仍然相同,从另一个序列构建一个列表。但是这一次,您要让语言来处理该实现,您只需提供一个功能即可应用于每个项目,即可filter将一个列表转换为另一个列表。

在上面的示例中。 Seq.filter将通过html.Objects执行循环,并且仅将与功能匹配的项目返回到新序列中。然后将其转换为将保存结果的列表(F#中的数组优先于列表)。如果没有toList,它将仍然是sequence