我正在尝试创建一个可用的经度和纬度对数组,它们在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
答案 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。