Вставка в массив внутри цикла - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь создать массив доступных пар долготы и широты, которые возвращаются в 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

Я знаю, что array инициализация в строке # 9 неверна, я также знаю, что условные if оператор в строке № 13 не закончен.Я могу распечатать пары в строке № 14 следующим образом, но я не могу понять, как это полезно для меня:

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

1 Ответ

0 голосов
/ 22 октября 2018

В функциональном программировании старайтесь избегать построения списков, просматривая данные и элементы в новом списке.Это императивный подход, основанный на изменении общего состояния.

В вашем примере рассмотрите возможность сделать это следующим образом:

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

let main = 
  let availableList = getCoordinates true

Это все тот же результат, построение одного списка из другой последовательности,Но на этот раз вы позволяете языку заниматься реализацией этого, вы просто предоставляете функцию, которую хотите применить к каждому элементу, для фильтра одного списка в другом.

В приведенном выше примере,Seq.filter выполнит цикл по html.Objects и вернет только элементы, которые соответствуют функции, в новую последовательность.Затем он преобразуется в список (предпочтение спискам, а не массивам в F #), в котором будут храниться результаты.Без toList это было бы просто последовательность все еще.

...